从shell传递给sql的变量不起作用

时间:2017-04-15 05:38:55

标签: sql bash shell awk oracle11g

我的代码是:

#!/bin/sh
cat tmp_ts.log | awk ' {print $8}'
lookup=$8
sqlplus -s "sys/Orcl1234 as sysdba" << EOF
SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name='$lookup';
exit;
EOF

,我的输出是:

IAM_OIM
no rows selected

在这个变量查找中,我已经传递给select语句,但是它没有工作。

我的最终结果应该是select语句。请参阅下面的select query的输出:

见下文:

enter image description here

我的最终结果应该是这个,但该变量在select语句中不起作用。

2 个答案:

答案 0 :(得分:0)

#!/bin/sh
lookup="$(awk '/tablespace/{print $8;exit}' tmp_ts.log)"
echo "Querying database with lookup = $lookup"
sqlplus -s "sys/Orcl1234 as sysdba" <<EOF
SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name='$lookup';
exit;
EOF

您必须使用awk的输出来设置lookup。 shell对$8中设置的awk一无所知。此外,我已确保awk在第一个匹配行之后退出,因此不存在返回多个值的风险,或者只是在您的版本中执行空行。

答案 1 :(得分:0)

您可以使用awksedcut等命令填充查询。

lookup=$(cut -d" "  -f8 tmp_ts.log)  

您应该添加一些检查,例如@Dario(第一次匹配后退出,只转换tablespace行,但没有行匹配时该怎么做?)。

如果您未添加支票,则可以跳过设置$lookup

sqlplus -s "sys/Orcl1234 as sysdba" << EOF
SELECT tablespace_name FROM dba_tablespaces
 WHERE tablespace_name='$(sed 's/.*tablespace- //' tmp_ts.log)';
exit;
EOF