如何使用refcursor的精确结构声明变量?

时间:2015-02-27 11:04:46

标签: postgresql loops cursor plpgsql dynamic-sql

我的数据库是PostgreSQL 9.3.5。

我有一个动态查询,每次运行都会填充不同数量的列。为此,我们必须捕获该运行时结构。我们认为refcursor结构没问题。但是如何宣布?

示例:

DECLARE
  curs1 refcursor;
  v_cols  curs1%ROWTYPE;----> It is giving us error
BEGIN
  OPEN curs1 FOR EXECUTE 'SELECT * FROM '|| tablename||'';
  LOOP
    FETCH curs1 INTO ....;  --->Here how to capture the data
    EXIT WHEN NOT FOUND;
  END LOOP;
  CLOSE curs1;
END;

1 个答案:

答案 0 :(得分:0)

像@a_horse评论的那样,record将完成这项工作。请注意,record只是任何行类型的占位符,在第一次分配之前无法访问:

CREATE OR REPLACE FUNCTION foo(_tbl regclass)
  RETURNS ??? AS
$func$
DECLARE
  v_cols record;
BEGIN
  FOR v_cols IN
     EXECUTE 'SELECT * FROM '|| _tbl;
  LOOP
     -- loop is only entered if a (next) row is found
     -- do stuff
  END LOOP;
END
$func$ LANGUAGE plpgsql;

FOR loop通常比手动处理游标更简单,更快。

对于动态代码,请使用 FOR-IN-EXECUTE - 并确保防范SQL注入!
regclass 作为参数的数据类型执行(现有!)表名的操作: