将参数传递给包含来自Shell脚本的ACCEPT的SQL * Plus脚本

时间:2014-11-03 02:16:40

标签: oracle shell sqlplus

我正在尝试从Korn shell脚本调用SQL * Plus(10g)脚本。

我不允许修改SQL * Plus脚本,并且其中包含SQL * Plus ACCEPT命令。

我试图通过Korn Shell脚本将此ACCEPT命令变量(下面的7788)的特定参数传递给SQL * Plus脚本。

以下是SQL * Plus脚本的缩小版本oracle_code.sql

SET VERIFY OFF
ACCEPT abc PROMPT "Enter an empno:"
SELECT e.ename
FROM   emp       e
WHERE  TO_CHAR(e.empno) = '&abc'
;

这是我尝试使用Korn shell脚本(wrapping_shell_script.sh)进行通话:

#!/usr/bin/ksh
# wrapping_shell_script.sh
# Expecting one and exactly one parameter to be passed, the password for SCOTT
if [ $# -ne 1 ]
then
    echo "USAGE: wrapping_shell_script.sh <SCOTT_Password>"
    exit 1
fi

passwd="$1"

echo `date`

sqlplus -s scott/${passwd} @oracle_code.sql << EOF1
7788
EOF1

这是我从Korn shell命令行运行shell脚本时的样子:

$ wrapping_shell_script.sh tiger
Fri Oct 31 16:23:20 CDT 2014
Enter an empno:
no rows selected

$

我尝试传递的7788值并未进入SQL * Plus脚本的abc词法参数。

如何更改我的Korn shell脚本,以便传入指定的值,并执行调用的SQL * Plus脚本?

感谢。

4 个答案:

答案 0 :(得分:1)

这里的原创海报......

谢谢大家,确认我的方法应该有效。

我做了一些挖掘,并且感谢info at this link,我发现我的代码执行时生效的login.sql包含SET DEFINE OFF

通过在调用Oracle脚本之前向我的shell脚本添加SET DEFINE ON,我的代码已成功完成。

再次感谢提示!

答案 1 :(得分:0)

它对我也很好。我想知道,您是否检查查询是否实际上将为7781返回一行?

答案 2 :(得分:0)

一旦发现问题,它总是很容易,但是创建了VERIFY选项来调试变量设置。鉴于您无法更改调用SQL文件,但您可以更改(g)login.sql,您可以设置:

set verify on

但是,只是发现其他选项是意外的。

答案 3 :(得分:0)

@Tebbe像魅力一样工作,谢谢!

我知道这个帖子已经过时了,以防它帮助其他人:

这是我从Tebbe的脚本创建的修改版本,用于接受变量并将它们传递给一对ACCEPT语句。注意,我学会了很难在EOF1打开和变量赋值之间放置任何空格,制表符等,否则你会在变量值中引入空格/制表符等。那是

this is ok:

<< EOF1
$tbl

but this is not:

<< EOF1
    $tbl

# Begin Script

#!/usr/bin/ksh
# gfvbsaddpol_wrapper.sh
# Expecting tbl and owner to be passed 

tables='SCBCRKY SCBCRSE SCBDESC SCBSUPP SCRATTR SCRCLBD SCRCORQ SCRCPRT SCRCRDF SCREQIV SCRFEES SCRGMOD SCRINTG SCRLEVL SCRMEXC SCRRARE SCRRATT SCRRCAM SCRRCHR SCRRCLS SCRRCMP SCRRCOL SCRRDEG SCRRDEP SCRRLVL SCRRMAJ SCRRPRG SCRRTRM SCRRTST SCRSBGI SCRSCHD SCRSYLN SCRSYLO SCRSYRM SCRSYTR SCRTEXT SIRASGN SSBWLSC SSRCLBD SSRRATT SSRRCHR SSRRDEP SHRGCOM SHRSCOM SSBDESC SSBFSEC SSBOVRR SSBSECT SSBSSEC SSRATTR SSRBLCK SSREXTN SSRCORQ SSREVAL SSRFEES SSRLINK SSRMEET SSRRMAJ SSRMPRT SSRMRDF SSRRARE SSRRCLS SSRRCMP SSRRDEG SSRRCOL SSRRESV SSRRFND SSRRLVL SSRRPRG SSRRSTS SSRRTST SSRSCCD SSRSPRT SSRSRDF SSRSYLN SSRSYLO SSRSYRM SSRSYTR SSRTEXT SSRXLST SSTSCHW'

owner='SATURN'

# if [ $# -ne 1 ]
# then
#   echo "USAGE: wrapping_shell_script.sh <UrPassw0rd>"
#   exit 1
# fi

for tbl in $tables
do
passwd="UrPassw0rd"

echo `date`

sqlplus -s username/${passwd}@SID @gfvbsaddpol.sql << EOF1
$tbl
$owner
EOF1
done