我知道这是一个经常讨论的话题,但我已经尝试过其他帖子中的所有答案都无济于事,所以我最终决定发布我的情况。
在我的剧本中:
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
答案 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>
希望这会有所帮助。让我们知道。感谢。