postgres实用程序脚本中的参数

时间:2013-11-06 20:14:01

标签: database postgresql shell

我需要创建一个实用程序脚本来在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,它调用带有插入的那个。

2 个答案:

答案 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版本:使用特殊的bash语法将变量中的引号加倍。

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
相关问题