【问题标题】:Passing Parameter to SQL*Plus Script Containing ACCEPT From Shell Script将参数传递给包含从 Shell 脚本接受的 SQL*Plus 脚本
【发布时间】:2014-12-29 16:10:04
【问题描述】:

我正在尝试从 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 脚本?

谢谢。

【问题讨论】:

  • +1 格式正确的问题!这看起来不错,我的猜测是 sqlplus 正在读取键盘(或同样愚蠢的东西)而不是标准输入。但是,可以肯定的是,您是否尝试过 echo 7788 | sqlplus ... ?祝你好运。
  • 我已经复制/粘贴了您的代码,它运行良好。我还打开了验证以进行双重检查,并且参数传递正常:[oracle@dbsgoel1 gvenzl]$ ./wrapping_shell_script.sh tiger Mon Nov 3 10:50:00 GMT 2014 Enter an empno: ENAME ---------- SCOTT 验证打开:[oracle@dbsgoel1 gvenzl]$ ./wrapping_shell_script.sh tiger Mon Nov 3 10:50:27 GMT 2014 Enter an empno:old 3: WHERE TO_CHAR(e.empno) = '&amp;abc' new 3: WHERE TO_CHAR(e.empno) = '7788' ENAME ---------- SCOTT
  • 我建议设置verify on并检查参数是否传递成功。如果您不允许修改它,也许可以通过复制/粘贴 sql 脚本。

标签: oracle shell sqlplus


【解决方案1】:

它对我来说也很好。我想知道,您是否检查了查询是否真的会为 7781 返回一行?

【讨论】:

    【解决方案2】:

    这里是原始海报......

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

    我进行了一些挖掘,感谢info at this link,我发现在我的代码执行时有效的login.sql 包含SET DEFINE OFF。

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

    再次感谢您的提示!

    【讨论】:

      【解决方案3】:

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

      set verify on
      

      但是,没想到只发现其他选项被设置了。

      【讨论】:

        【解决方案4】:

        @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
        

        【讨论】:

          猜你喜欢
          • 2016-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多