如何使用 refcursor 的精确结构声明变量?
Posted
技术标签:
【中文标题】如何使用 refcursor 的精确结构声明变量?【英文标题】:How to declare a variable using exact structure of the refcursor? 【发布时间】:2015-02-27 11:04:46 【问题描述】:我的数据库是 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;
【问题讨论】:
是的,非常感谢 a_horse_with_no_name 总是在问题中包含函数头,它是函数的一个组成部分。参数和返回类型与其余部分相关。tablename
的数据类型供初学者使用。
【参考方案1】:
就像@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 通常比手动处理光标更简单、更快捷。
Truncating all tables in a Postgres database
Cursor based records in PostgreSQL
对于动态代码,请使用 FOR-IN-EXECUTE
- 并确保防范 SQL 注入!regclass
作为参数的数据类型,用于 (现有的!)表名:
【讨论】:
以上是关于如何使用 refcursor 的精确结构声明变量?的主要内容,如果未能解决你的问题,请参考以下文章
在存储过程中声明 SYS_REFCURSOR 和 ROWTYPE
oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)