我需要创建一个实用程序脚本来在postgres数据库中添加项目。 我最初的方法是使用一组带有最小非默认值的bash脚本和一个带有剩余默认列的postgres sql脚本。项目表有20列。
所以这是我简化的bash脚本:
## A unique system identifier for an Item.
ID_ITM='318'
## The description of the Item.
DE_ITM="A description"
psql -U postgres -d MYDB -v id_itm=$ID_ITM de_itm=$DE_ITM -f insertItemPostgres.sql
如您所见,它调用以下sql脚本(简化):
Insert into AS_ITM (ID_ITM,ID_LN_PRC,ID_ITM_SL_PRC,ID_MRHRC_GP,ID_RU_ITM_SL,ID_DPT_PS,FL_ITM_DSC,FL_ADT_ITM_PRC,NM_BRN,FL_AZN_FR_SLS,LU_ITM_USG,NM_ITM,DE_ITM,TY_ITM,LU_KT_ST,DE_ITM_LNG,FL_ITM_SBST_IDN,LU_CLN_ORD,LU_EXM_TX,FL_VLD_SRZ_ITM)
values (:id_itm,:de_itm,null,'64',null,null,null,null,null,'1',null,null,null,null,'0',null,'0',null,'0','0');
我的问题是,为了完成这项工作,我需要有两对引号的字符串和id:
DE_ITM="'A description'"
我需要找出如何在文字中传递参数。
我会感谢任何更好的方法,因为我知道这不是最好的,我的db脚本技能不是最好的。我也使用bash脚本,但我可能只是一个带有非默认值的sql,它调用带有插入的那个。
答案 0 :(得分:2)
如果您有psql 9.0或更高版本,可以尝试以下操作:
首先,您需要在shell中引用两个变量的扩展,如下所示:
psql -U postgres -d MYDB -v "id_itm=${ID_ITM}" -v "de_itm=${DE_ITM}" -f insertItemPostgres.sql
然后在SQL中,您需要使用以下语法引用变量:
INSERT INTO as_itm (id_itm, id_ln_prc, ...)
VALUES (:'id_itm', :'de_itm', ...)
psql -U postgres -d MYDB -f insertItemPostgres.sql \
-v "id_itm='${ID_ITM//\'/''}'" \
-v "de_itm='${DE_ITM//\'/''}'"
在这种情况下,SQL中的变量引用应该与OP保持不变:VALUES (:id_itm, :de_itm, ...
答案 1 :(得分:1)
使用shell HERE文档:扩展shell变量,即使是单引号也是如此。
#!/bin/sh
## A unique system identifier for an Item.
ID_ITM="318"
## The description of the Item.
DE_ITM="A description"
psql -U postgres -d MYDB << THE_END
Insert into AS_ITM(ID_ITM, ID_LN_PRC, ID_ITM_SL_PRC, ID_MRHRC_GP, ID_RU_ITM_SL
, ID_DPT_PS, FL_ITM_DSC, FL_ADT_ITM_PRC, NM_BRN, FL_AZN_FR_SLS
, LU_ITM_USG, NM_ITM,DE_ITM, TY_ITM, LU_KT_ST, DE_ITM_LNG
, FL_ITM_SBST_IDN, LU_CLN_ORD, LU_EXM_TX, FL_VLD_SRZ_ITM)
values ('$ID_TTM', null,'64', null, null
, null, null, '$DE_ITM' , '1', null
, null, null, null, '0', null
, '0', null, '0', '0');
THE_END