3

我需要创建一个实用程序脚本来在 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'"

我需要找出如何以文字形式传递参数。

我将不胜感激任何更好的方法,因为我知道这不是最好的,而且我的数据库脚本技能也不是最好的。此外,我正在使用一个 bash 脚本,但我可能只是一个具有非默认值的 sql,它调用具有插入的那个。

4

2 回答 2

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

于 2013-11-06T22:42:07.517 回答
1

使用 shell HERE-document:扩展 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
于 2013-11-07T00:13:54.960 回答