【问题标题】:How to declare a variable using exact structure of the refcursor?如何使用 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 的数据类型供初学者使用。

标签: postgresql loops cursor plpgsql dynamic-sql


【解决方案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 通常比手动处理光标更简单、更快捷。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2014-04-25
    相关资源
    最近更新 更多