Oracle 将参数传递给SQL*Plus脚本,该脚本包含从Shell脚本接受

Oracle 将参数传递给SQL*Plus脚本,该脚本包含从Shell脚本接受,oracle,shell,sqlplus,Oracle,Shell,Sqlplus,我正在尝试从Korn shell脚本调用SQL*Plus(10g)脚本 我不允许修改SQL*Plus脚本,它有一个SQL*PlusACCEPT命令 我正试图通过KornShell脚本将这个ACCEPT命令变量(7788下文)的特定参数传递给SQL*Plus脚本 下面是SQL*Plus脚本的精简版本,oracle\u code.SQL: SET VERIFY OFF ACCEPT abc PROMPT "Enter an empno:" SELECT e.ename FROM emp

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

我不允许修改SQL*Plus脚本,它有一个SQL*Plus
ACCEPT
命令

我正试图通过KornShell脚本将这个ACCEPT命令变量(
7788
下文)的特定参数传递给SQL*Plus脚本

下面是SQL*Plus脚本的精简版本,
oracle\u 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\u shell\u 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
我试图传递的
7788
值没有进入SQL*Plus脚本的
abc
词法参数

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


谢谢。

这对我来说也很好。我想知道,您是否检查过查询是否会返回7781的行?

这里是原始海报

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

我做了一些挖掘,多亏了,我发现在代码执行时生效的
login.sql
包含一个
集DEFINE OFF

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


再次感谢你的提示

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

set verify on

但是,只有找到其他选项是出乎意料的。

@Tebbe工作得很有魅力,谢谢

我知道这条线很旧,但为了以防万一,它可以帮助其他人:

下面是我从Tebbe的脚本创建的一个修改版本,用于接受变量并将它们传递给一对accept语句。注意,我学到了艰难的方法,不要在EOF1 open和变量赋值之间放置任何空格、制表符等,否则会在变量值中引入空格/制表符等。就是

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
这没问题:

+1对于格式良好的问题!这看起来不错,我猜sqlplus是在读键盘(或者其他同样愚蠢的东西),而不是标准输入法。但是,可以肯定的是,您是否尝试过
echo7788 | sqlplus…
?祝你好运。我已经复制/粘贴了你的代码,它在我这边运行得很好。我还打开了verify to double check,并将参数传递到fine:
[oracle@dbsgoel1gvenzl]$./wrapping_shell_script.sh tiger Mon 2014年11月3日10:50:00 GMT输入empno:ENAME------SCOTT
,验证开启:
[oracle@dbsgoel1gvenzl]$./wrapping_shell_script.sh tiger Mon Nov 3 10:50:27 GMT 2014输入empno:old 3:WHERE TO_CHAR(e.empno)='&abc'new 3:WHERE TO_CHAR(e.empno)='7788'ENAME------SCOTT
我建议设置验证并检查参数是否成功传递。如果不允许修改sql脚本,可以通过复制/粘贴该脚本。
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