如何使用 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 只是任何行类型的占位符,在第一次分配之前无法访问:

Passing column names dynamically for a record variable in PostgreSQL

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 作为参数的数据类型,用于 (现有的!)表名:

Table name as a PostgreSQL function parameter

【讨论】:

以上是关于如何使用 refcursor 的精确结构声明变量?的主要内容,如果未能解决你的问题,请参考以下文章

在存储过程中声明 SYS_REFCURSOR 和 ROWTYPE

oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)

在 Oracle 11g 的过程中将 REFCURSOR 变量打印为 OUT 参数时出错

c 中结构体变量 如何在其他c文件中声明

将 refcursor 视为表 - Oracle

Oracle Cursor用法总结