首页 > 解决方案 > 在函数声明中使用 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 正确替换为其值。

解决方案是什么?

标签: variablespsql

解决方案


似乎 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

推荐阅读