Hob*_*bes 6 postgresql plpgsql
我正在尝试在PL/PgSQL中编写一个函数,它必须使用它作为参数接收的表.
我在函数定义中使用EXECUTE..INTO..USING语句来构建动态查询(这是我知道这样做的唯一方法)但是...我遇到了RECORD数据类型的问题.
让我们考虑以下(极简化)示例.
-- A table with some values.
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (
code INT,
descr TEXT
);
INSERT INTO table1 VALUES ('1','a');
INSERT INTO table1 VALUES ('2','b');
-- The function code.
DROP FUNCTION IF EXISTS foo (TEXT);
CREATE FUNCTION foo (tbl_name TEXT) RETURNS VOID AS $$
DECLARE
r RECORD;
d TEXT;
BEGIN
FOR r IN
EXECUTE 'SELECT * FROM ' || tbl_name
LOOP
--SELECT r.descr INTO d; --IT WORK
EXECUTE 'SELECT ($1)' || '.descr' INTO d USING r; --IT DOES NOT WORK
RAISE NOTICE '%', d;
END LOOP;
END;
$$ LANGUAGE plpgsql STRICT;
-- Call foo function on table1
SELECT foo('table1');
Run Code Online (Sandbox Code Playgroud)
它输出以下错误:
错误:无法识别记录数据类型中的列"descr"
虽然我使用的语法似乎对我有用.我不能使用静态选择(在示例中注释),因为我想以dinamically方式引用列名称.
那么......有人知道上面代码有什么问题吗?
小智 7
这是真的.你不能在PL/pgSQL空间之外使用类型记录.
RECORD值仅在plpgsql中有效.
你可以做
EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24244 次 |
| 最近记录: |