在函数声明中使用psql环境

时间:2019-04-15 16:57:55

标签: variables psql

我无法在函数声明中使用参数。

SQL脚本,如:

CREATE OR REPLACE FUNCTION test_functon() RETURNS trigger AS
$BODY$
DECLARE
  test int:=:SRID;
BEGIN
  RETURN NEW;
END; 
$BODY$
LANGUAGE plpgsql;

在文件中。

并运行psql -v SRID=2056 -f my_file.sql

导致错误

  

错误:“:”或附近的语法错误

这看起来像是在运行SQL时,没有用其值正确替换var。

对此有什么解决方案?

1 个答案:

答案 0 :(得分:1)

psql似乎不会在函数体内插值变量。

以下SQL对此进行验证。

SELECT :SRID;

CREATE OR REPLACE FUNCTION test_functon() RETURNS :TYPE AS
$BODY$
BEGIN
  RETURN :SRID;
END; 
$BODY$
LANGUAGE plpgsql;

运行该文件将导致以下结果:

$ psql -v SRID=2056 -v TYPE=int -f query.sql
Expanded display is used automatically.
Null display is "¤".
 ?column?
----------
     2056
(1 row)

psql:query.sql:9: ERROR:  syntax error at or near ":"
LINE 4:   RETURN :SRID;
                 ^

请注意,变量TYPE所定义的返回类型仍是如何插值的,但体内的所有内容均超出了限制。

您将不得不采用另一种机制来将变量放入其中。您可以利用以下事实:psql通过STDIN接受查询:

$ sed 's/:SRID/2056/' query.sql | psql