pst*_*elk 20 postgresql dynamic-sql psql
我试图使用动态SQL在postgres中运行一些查询.
例:
EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)))
Run Code Online (Sandbox Code Playgroud)
我必须查询一个表,其格式为result_%s_table,其中,我需要用另一个表替换正确的表名(一个id).
我收到了错误 ERROR: prepared statement "format" does not exist
Cra*_*ger 29
EXECUTE ... USING
仅适用于PL/PgSQL - 即在用PL/PgSQL语言编写的函数或DO
块中.它在纯SQL中不起作用; 的EXECUTE
在普通的SQL是完全不同的,用于执行准备的语句.您不能直接在PostgreSQL的SQL方言中使用动态SQL.
相比:
请参阅我之前的答案中的第二个标准.
除了PL/PgSQL之外没有运行你的SQL语句是错误的,它不会做你期望的.如果(select id from ids where condition = some_condition)
返回说42
,如果id
是整数,则语句将失败.如果它被转换成文本你会得到:
EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';
Run Code Online (Sandbox Code Playgroud)
那是无效的.你真的想要result_42_table
或"result_42_table"
.你必须写更多的东西:
EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))
Run Code Online (Sandbox Code Playgroud)
......如果你必须使用quote_ident
.
CREATE OR REPLACE FUNCTION public.exec(
text)
RETURNS SETOF RECORD
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
RETURN QUERY EXECUTE $1 ;
END
$BODY$;
Run Code Online (Sandbox Code Playgroud)
用法:
select * from exec('select now()') as t(dt timestamptz)
Run Code Online (Sandbox Code Playgroud)
尝试使用
RETURN QUERY EXECUTE '<SQL Command>'
Run Code Online (Sandbox Code Playgroud)
这会将数据返回到表格形式。您必须将其用于PostgreSQL的存储功能。
我已经使用PostgreSQL的动态查询对自定义过滤器和自定义排序进行了完整的演示。请访问此网址:http : //www.dbrnd.com/2015/05/postgresql-dynamic-sql/
归档时间: |
|
查看次数: |
54632 次 |
最近记录: |