postgresql - 如何从存储在表中的字符串中准备和执行查询
问题描述
这个存储的函数返回一个查询:
DROP FUNCTION IF EXISTS get_query (
ctl text, scm text, tbl text, seq text);
CREATE OR REPLACE FUNCTION get_query (
ctl text, scm text, tbl text, seq text)
RETURNS text
AS
$$
select concat('insert into ',$2,'.',$1, ' select nextval("',$4,'") as id, ',
string_agg(concat('NEW.', column_name), ', '), ', current_timestamp as audited_at;')
from information_schema.columns
where table_catalog = $1
and table_schema = $2
and table_name = $3
$$
LANGUAGE sql;
我如何PREPARE
查询这个函数返回的。
我想在触发触发器时在表中插入一条记录,但我不想指定要插入的列列表。架构可能会不断变化。因此,尝试使用准备好的语句。
此示例代码说明了我的意思是要执行的查询字符串:
DROP FUNCTION IF EXISTS fn_name (store_temporary_query text);
CREATE OR REPLACE FUNCTION fn_name (store_temporary_query text)
RETURNS table (query text)
LANGUAGE plpgsql
AS
$$
begin
select 'select 1 as ID' into store_temporary_query;
return query (select store_temporary_query);
end;
$$
select fn_name('');
上面的查询给出以下输出
fn_name
select 1 as ID
期望的结果是查询
ID
1
编辑#2
DROP FUNCTION IF EXISTS fn_name (store_temporary_query text);
CREATE OR REPLACE FUNCTION fn_name (store_temporary_query text)
RETURNS table (query text)
LANGUAGE plpgsql
AS
$$
begin
select 'select 1 as ID;' into store_temporary_query;
return query execute store_temporary_query;
end;
$$
select fn_name('');
这让我们来到这里,
Error executing SQL statement. ERROR: syntax error at or near "select"
Position: 254 - Connection: Aurora Legacy: 794ms
解决方案
您需要EXECUTE
执行存储在字符串中的查询:
RETURN QUERY EXECUTE store_temporary_query;
推荐阅读
- javascript - 在浏览器中安装 AdBlock 扩展时,如何使用 Blob 在新页面中显示 pdf\jpg 文件
- c# - 如何通过列表
从 C# 到 C++ CLi? - c - 了解如何使用 C 中的位运算符计算数字的尾随零
- azure-devops - 如何设置条件以避免重复运行为用户故事创建任务
- lte - LTE中集中式无线资源管理与分布式无线资源管理的区别
- c# - 在 IE 中安装 activeX 时如何修复“读取设置初始化文件时出错”?
- python - 如何使用 Keras 生成器选择 batch_size、steps_per_epoch 和 epoch
- kubernetes - Alb Ingress Controller target-type:instance 如何转发请求
- php - 如何插入库存数量并更新到另一个表中?
- python - 解决异常时如何知道哪个参数有错误消息?