【问题标题】:psql passing parameter to sql scriptpsql 将参数传递给 sql 脚本
【发布时间】:2022-01-13 06:32:10
【问题描述】:

psql 9.2 版,服务器 12.0 版。

试图将参数传递给 sql 脚本, 执行脚本并传递参数:

psql --echo-queries -v ON_ERROR_STOP=0 -v TEST=100 postgresql://${curr_connection}<< EOF 1 > ${log_file} 2>&1
\timing
\i sql_script.sql
EOF

请注意,我确认脚本在使用硬编码值(不带参数)时没有问题, 我想这可能与引号或其他内容中的参数有关,

sql_script.sql

INSERT INTO ACT_HI_COMMENT (action_,full_msg_,id_,message_,proc_inst_id_,task_id_,time_,type_,user_id_)
SELECT * FROM DBLINK ('host= MYHOST user=MYUSER password = MYPASS dbname=MYDB port=6432',
'SELECT ACT_HI_COMMENT.message_,ACT_HI_COMMENT.proc_inst_id_ FROM ACT_HI_COMMENT 
where ACT_HI_COMMENT.TASK_ID_ in (Select distinct CBAN_A.TASK_ID_ from CBAN_OSS_ACT_RU_VARIABLE_TASK 
where CBAN_OSS_ACT_RU_VARIABLE_TASK.GROUP_ID = :TEST )')
 AS LINKTABLE (proc_inst_id_ character varying,task_id_ character varying,time_ timestamp without time zone,type_ character varying,
user_id_ character varying);

得到错误:

psql:/infadmin/inf/sql_script.sql:2: ERROR: syntax error at or near ":"
CONTEXT: while executing query on unnamed dblink connection

我还尝试在它周围加上一个单引号:'TEST'

INSERT INTO ACT_HI_COMMENT (action_,full_msg_,id_,message_,proc_inst_id_,task_id_,time_,type_,user_id_)
SELECT * FROM DBLINK ('host= MYHOST user=MYUSER password = MYPASS dbname=MYDB port=6432',
'SELECT ACT_HI_COMMENT.message_,ACT_HI_COMMENT.proc_inst_id_ FROM ACT_HI_COMMENT 
where ACT_HI_COMMENT.TASK_ID_ in
 (Select distinct CBAN_A.TASK_ID_ from CBAN_OSS_ACT_RU_VARIABLE_TASK
 where CBAN_OSS_ACT_RU_VARIABLE_TASK.GROUP_ID = :'TEST' )') 
AS LINKTABLE (proc_inst_id_ character varying,task_id_ character varying,time_ timestamp without time zone,type_ character varying,user_id_ character varying);

得到错误:


psql:/infadmin/inf/sql_script.sql:2: ERROR: syntax error at or near "TEST"
LINE 2: ... where CBAN_OSS_ACT_RU_VARIABLE_TASK.GROUP_ID = :'TEST' ..

【问题讨论】:

    标签: postgresql psql


    【解决方案1】:

    怀疑,它没有工作,因为参数在单引号内, 我通过将引号内的整个字符串拆分为 2 来解决它, 由

    ' first_part '|| :'TEST'||'  <second_part>'
    
    

    所以sql看起来像

    INSERT INTO ACT_HI_COMMENT (action_,full_msg_,id_,message_,proc_inst_id_,task_id_,time_,type_,user_id_)
    SELECT * FROM DBLINK ('host= MYHOST user=MYUSER password = MYPASS dbname=MYDB port=6432',
    'SELECT ACT_HI_COMMENT.message_,ACT_HI_COMMENT.proc_inst_id_ FROM ACT_HI_COMMENT 
    where ACT_HI_COMMENT.TASK_ID_ in
     (Select distinct CBAN_A.TASK_ID_ from CBAN_OSS_ACT_RU_VARIABLE_TASK
     where CBAN_OSS_ACT_RU_VARIABLE_TASK.GROUP_ID = '|| :'TEST'||' )')
    AS LINKTABLE (proc_inst_id_ character varying,task_id_ character varying,time_ timestamp without time zone,type_ character varying,user_id_ character varying);
    
    
    ``
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2020-09-08
      • 2015-10-20
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多