PostgreSQL中的EXECUTE语句语法错误

时间:2017-12-14 12:43:23

标签: sql postgresql plpgsql

我正在研究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。我正在进行的查询不是为前端使用而设计的,我遵循我正在修改的库已经提出的设计模式。

1 个答案:

答案 0 :(得分:2)

您混淆SQL执行和plpgsql执行 - 首先执行预准备语句并在SQL中运行(当您尝试时)。第二个是函数plpgsql代码的一部分

https://www.postgresql.org/docs/current/static/sql-execute.html

  

执行 - 执行预备声明

https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

  

通常你会想要在你的内部生成动态命令   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。