【问题标题】:Postgres cursor targetsPostgres 光标目标
【发布时间】:2019-04-13 12:42:48
【问题描述】:

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

【问题讨论】:

    标签: postgresql plpgsql postgres-9.6


    【解决方案1】:

    我希望documentation 是干净的。

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      相关资源
      最近更新 更多