如何将bash变量传递给PSQL函数体?

时间:2017-08-14 06:53:37

标签: bash function psql

我目前正在尝试将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函数中,它没有用。 它返回了这个错误......

  

错误:“:”

处或附近的语法错误

有没有人知道如何正确地做到这一点? 谢谢,伙计们。

1 个答案:

答案 0 :(得分:0)

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

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