Postgres游标目标

时间:2018-11-09 22:56:24

标签: postgresql plpgsql postgres-9.6

我希望能获得有关创建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

1 个答案:

答案 0 :(得分:0)

我希望documentation是干净的。

  

FETCH将光标的下一行检索到目标中,该目标可能是行变量,记录变量或用逗号分隔的简单变量列表,就像SELECT INTO一样。如果没有下一行,则将目标设置为NULL。与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;