postgresql 创建匿名DO块

tpxzln5u  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(172)

以Sergey为例,https://stackoverflow.com/a/60834163/1513027
我试图创建一个匿名DO块而不是函数。
如果我在块中有FETCH,它会给出一个语法错误,可能需要一个INTO子句,并且游标的名称是否在引号中并不重要。

DO 
$$
DECLARE  _query TEXT;
DECLARE  _cursor CONSTANT refcursor := _cursor;

BEGIN
   _query := 'select "Port", "Version", "AddDate" from "LatestLogEntry";';

   OPEN _cursor FOR EXECUTE _query;

   FETCH ALL FROM _cursor;   -- syntax error at ;
END
$$;

如果我把它放在外面,就像Sergey的例子一样,那么它就看不到在块内部声明的游标,而且游标的名字是否用引号括起来也很重要。

DO 
$$
DECLARE  _query TEXT;
DECLARE  _cursor CONSTANT refcursor := '_cursor';

BEGIN
   _query := 'select "Port", "Version", "AddDate" from "LatestLogEntry";';

   OPEN _cursor FOR EXECUTE _query;
END
$$;

FETCH ALL FROM _cursor -- ERROR:  cursor "_cursor" does not exist
u1ehiz5o

u1ehiz5o1#

答案隐藏在其中一个示例的注解中。
--需要在事务中才能使用游标。
将其 Package 在事务中是有效的。

BEGIN;
DO 
$$
DECLARE  _query TEXT;
DECLARE  _cursor CONSTANT refcursor := '_cursor';

BEGIN
   _query := 'select "Port", "Version", "AddDate" from "LatestLogEntry";';

   OPEN _cursor FOR EXECUTE _query;
END
$$;

FETCH ALL FROM _cursor -- ERROR:  cursor "_cursor" does not exist

COMMIT
9gm1akwq

9gm1akwq2#

在pgadmin中,此操作有效,请参见下面的屏幕,运行postgres 15
正如Sergey所指出的,这必须在事务中进行,否则您将得到错误消息。

你可以试着把它用在

相关问题