如何在Unix shell脚本中使用sqlplus select string中的单引号

时间:2017-02-16 19:09:57

标签: oracle shell unix sqlplus

我知道这是一个经常讨论的话题,但我已经尝试过其他帖子中的所有答案都无济于事,所以我最终决定发布我的情况。

在我的剧本中:

failures=$(sqlplus -s << EOF
${SQLIN}
set heading off;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
select failures from dba_jobs where what like dbms_refresh.refresh%;
EOF
)

dbms_refresh.refresh%是我需要用单引号捕获的,但是,我知道仅使用单引号是不够的。我不完全理解unix和oracle如何在select命令中翻译单引号。

我试过以下但没有运气:

有人可以给我一个解释,说明unix和oracle如何相互交谈,以确定如何在选择查询中读取单引号?

编辑:如果我使用'dbms_refresh.refresh%'

,则下面是我的结果

select failures from dba_jobs where what like "dbms_refresh.refresh%" check_mview_test.sh check_mview_test_v1.ksh check_mview_test_v1.sh get_pageid_test.sh ERROR at line 1: ORA-00904: "dbms_refresh.refresh%": invalid identifier

2 个答案:

答案 0 :(得分:2)

你所展示的内容与ksh93中的单引号一起使用,但ksh88似乎是在命令替换中将单引号更改为双引号,或者可能在heredoc内部。这就是为什么在您的编辑中,使用单引号的yoru查询会报告显示(双)引号标识符的错误。

通过一些实验,您可以通过将作业从$(...)更改为反引号来避免这种情况:

failures=`sqlplus -s << EOF
${SQLIN}
set heading off;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
select failures from dba_jobs where what like 'dbms_refresh.refresh%';
EOF
`

或者你可以将字符串放入它自己的shell变量中,这似乎也避免了它;但这并不能真正扩展到更复杂的查询:

VALUE="'dbms_refresh.refresh%'"

failures=$(sqlplus -s << EOF
${SQLIN}
set heading off;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
select failures from dba_jobs where what like ${VALUE};
EOF
)

答案 1 :(得分:0)

似乎工作,虽然不完全在&#34; SQLPLUS&#34;但我在我的postgres上试过了。

以下是脚本:

=>|Fri Feb 17|01:23:36|postgres@[STATION]:/var/lib/pgsql> cat test.sh
#!/bin/bash
mytable="$1"
failures=$(psql <<EOF
select phonenumber from $mytable where phonenumber like '91%' ;
EOF
)
echo "==========RESULT==========="
echo $failures
echo "============END============"

=>|Fri Feb 17|01:23:39|postgres@[STATION]:/var/lib/pgsql>

输出:

=>|Fri Feb 17|01:24:12|postgres@[STATION]:/var/lib/pgsql> ./test.sh mdn_2
==========RESULT===========
phonenumber -------------- 919821217792 (1 row)
============END============

=>|Fri Feb 17|01:24:14|postgres@[STATION]:/var/lib/pgsql>

希望这会有所帮助。让我们知道。感谢。