我的数据库是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;
答案 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
作为参数的数据类型执行(现有!)表名的操作: