如何将 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'
我目前正在尝试将 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'