0

对于创建 pg9.6 结构以保存来自多个连接表的多行作为游标目标的最佳实践,我将不胜感激。文档对此并不清楚,其他搜索似乎表明使用临时表,如下所示。

DECLARE
    mycursor refcursor;
BEGIN
CREATE TEMPORARY TABLE tmp_persons (
    personid INTEGER,
    primaryconnect INTEGER
);
OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
LOOP
    FETCH mycursor INTO tmp_persons;

    .. do something using tmp_persons.personid, tmp_persons.primaryconnect
4

1 回答 1

0

我希望文档是干净的。

FETCH 将下一行从游标检索到目标中,该目标可能是行变量、记录变量或以逗号分隔的简单变量列表,就像 SELECT INTO。如果没有下一行,则将目标设置为 NULL(s)。与 SELECT INTO 一样,可以检查特殊变量 FOUND 以查看是否获得了行。

所以你不能使用临时表作为目标。如果没有任何特殊要求,请使用记录变量:

DECLARE 
  r record;
  mycursor refcursor;
BEGIN
  OPEN mycursor ..
  LOOP
    FETCH mycursor INTO r;
    EXIST WHEN NOT FOUND;
    RAISE NOTICE 'personid: %', r.personid;

对于这个简单的任务,最好使用FOR IN SELECT语句。

DECLARE r record;
BEGIN
  FOR r IN SELECT p.personid, ...
  LOOP
    RAISE NOTICE 'personid: %', r.personid;
于 2018-11-11T18:40:00.117 回答