如何在 Unix shell 脚本中的 sqlplus select 字符串中使用单引号
How to use single quotes in sqlplus select string in Unix shell script
我知道这是一个经常讨论的话题,但我尝试了其他 post 中的所有答案都无济于事,所以我最终决定 post 我的情况。
在我的脚本中:
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 如何相互交谈,以确定如何在 select 查询中读取单引号?
编辑:如果我使用 '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
似乎可以工作,虽然不完全是 "SQLPLUS" 但我在我的 postgres 上试过了。
脚本如下:
=>|Fri Feb 17|01:23:36|postgres@[STATION]:/var/lib/pgsql> cat test.sh
#!/bin/bash
mytable=""
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>
希望这对您有所帮助。让我们知道。谢谢
您所展示的内容在 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
)
我知道这是一个经常讨论的话题,但我尝试了其他 post 中的所有答案都无济于事,所以我最终决定 post 我的情况。
在我的脚本中:
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 如何相互交谈,以确定如何在 select 查询中读取单引号?
编辑:如果我使用 '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
似乎可以工作,虽然不完全是 "SQLPLUS" 但我在我的 postgres 上试过了。
脚本如下:
=>|Fri Feb 17|01:23:36|postgres@[STATION]:/var/lib/pgsql> cat test.sh
#!/bin/bash
mytable=""
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>
希望这对您有所帮助。让我们知道。谢谢
您所展示的内容在 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
)