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

How to pass bash variables to a PSQL function body?

我目前正在尝试将 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 函数内部,它不起作用。 它返回了这个错误...

ERROR: syntax error at or near ":"

有没有人知道如何正确执行此操作? 谢谢大家。

您需要使用 dynamic SQL. That is, put the whole function block into a string and pass the quoted script variables to the appropriate places, then EXECUTE that string. See also this SO 主题(Postgres 动态查询函数)了解如何构建语句。

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