psql, передающий параметр в sql-скрипт

#postgresql #psql

#postgresql #psql

Вопрос:

psql версии 9.2, сервер версии 12.0.

Попытка передать параметр в сценарий sql , выполнение сценария и передача параметра :

 psql --echo-queries -v ON_ERROR_STOP=0 -v TEST=100 postgresql://${curr_connection}lt;lt; EOF 1 gt; ${log_file} 2gt;amp;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   

Я также попробовал использовать одинарные кавычки вокруг него как :»ТЕСТ»

 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' ..   

Ответ №1:

Как подозреваю , это не сработало, так как параметр находится внутри одинарных кавычек , я решил эту проблему, разделив всю строку внутри кавычек на 2, путем

 ' first_part '|| :'TEST'||' lt;second_partgt;'   

Таким образом, 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);   ``