我正在研究PostgreSQL库的扩展,它将查询的字符串表示作为输入。基本上我需要实例化这个基于字符串的查询产生的结果表,修改它,然后将它传递给另一个函数。
现在我只是试图将查询设置为临时表,所以我使用此示例查询:
CREATE TEMPORARY TABLE pgr_table (seq INTEGER, path_seq INTEGER, node INTEGER, edge BIGINT, cost DOUBLE PRECISION, agg_cost DOUBLE PRECISION);
EXECUTE 'SELECT gid AS id, source, target, cost, reverse_cost FROM ways;' INTO pgr_table;
但是这会导致语法错误,就在EXECUTE
命令之后。我没有正确使用它吗?
顺便说一句,我知道SQL注入的危险并且使用EXECUTE
willy-nilly。我正在进行的查询不是为前端使用而设计的,我遵循我正在修改的库已经提出的设计模式。
答案 0 :(得分:2)
您混淆SQL执行和plpgsql执行 - 首先执行预准备语句并在SQL中运行(当您尝试时)。第二个是函数plpgsql代码的一部分
https://www.postgresql.org/docs/current/static/sql-execute.html
执行 - 执行预备声明
通常你会想要在你的内部生成动态命令 PL / pgSQL函数,即涉及不同的命令 表或每次执行时的不同数据类型。 PL / pgSQL的的 正常尝试缓存命令计划(如章节中所述) 42.10.2)在这种情况下不起作用。为了处理这类问题,提供了EXECUTE语句:
的示例:
t=# prepare s as select now();
PREPARE
t=# execute s;
now
-------------------------------
2017-12-14 12:47:28.844485+00
(1 row)
和plpgsql:
t=# do
$$
declare
t text;
begin
execute 'select now()' into t;
raise info '%',t;
end;
$$
;
INFO: 2017-12-14 12:48:45.902768+00
DO
<强> updtae 强>
为避免使用动态代码注入,请使用函数format
https://www.postgresql.org/docs/current/static/functions-string.html
根据格式字符串格式化参数。这个功能是 类似于C函数sprintf。