【问题标题】:How to pass bash variables to a PSQL function body?如何将 bash 变量传递给 PSQL 函数体?
【发布时间】:2017-08-16 09:58:34
【问题描述】:

我目前正在尝试将 bash 变量用于 PSQL 函数,我在 bash 脚本中运行 PSQL 文件,如下所示...

psql -h *DBHOST* -p *DBPORT* -U *DBUSER* -d *DBNAME* -f ./file.sql \
    -v var1=$bash_var1 -v var2=$bash_var2

在psql文件中,我可以通过...访问变量

:'var1' and :'var2'

我在一个函数里试了一下,这里是函数的一部分

CREATE OR REPLACE FUNCTION rename()
    RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    title TEXT;
    newTitle TEXT;
    docId TEXT;
    new_docId TEXT;
    var1 INT;
    var2 TEXT;
BEGIN
    CREATE TABLE IF NOT EXISTS files_renamed (
    uuid        char(40) ,
    name char (250),
    origin char (20)
    );
    FOR _r IN SELECT * from table LOOP
        docId := _r.id ;
        title := _r.title ;
        SELECT substring(docId, 1, doc_id_len) INTO new_docId;
        SELECT CONCAT(new_docId,:'var2') INTO newTitle;
        -- other codes --
    END LOOP;
END
$func$;

但是在这个 PSQL 函数内部,它不起作用。 它返回了这个错误...

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

有人知道如何正确执行此操作吗? 谢谢各位。

【问题讨论】:

  • 我不是 PSQL 用户,但您似乎需要以正确的方式将变量传递给函数体。这意味着,您可能需要将字符串放在引号中。并且提供一些更详细的示例代码会很有帮助。
  • 试试 -v var1=a${bash_var1}b 看看你的函数是否收到'ab'
  • edit问题包含实际的PSQL函数。
  • 我编辑了问题
  • 在函数之外,我尝试了 'SELECT :'var1';它有效,但在函数内部它返回了一个错误。

标签: bash function psql


【解决方案1】:

您需要使用dynamic SQL。也就是说,将整个功能块放入一个字符串中,并将引用的脚本变量传递到适当的位置,然后执行该字符串。另请参阅this SO 主题(Postgres 动态查询函数)了解如何构建语句。

EXECUTE
 'CREATE OR REPLACE FUNCTION rename()' ||
 ... || :'var1' || ... || 'END'

【讨论】:

  • 当然不客气……感谢您接受这个答案。
猜你喜欢
  • 2013-04-20
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2018-02-17
  • 2011-02-17
  • 1970-01-01
相关资源
最近更新 更多