2014-11-03 74 views
2

我試圖從Korn shell腳本調用SQL * Plus(10g)腳本。將參數傳遞給包含來自Shell腳本的ACCEPT的SQL * Plus腳本

我不允許修改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腳本執行?

謝謝。

+0

+1對於格式良好的問題!這看起來沒問題,我的猜測是sqlplus正在讀鍵盤(或者同樣愚蠢的東西)而不是stdin。但是,可以肯定的是,你是否嘗試過'echo 7788 | sqlplus ...'?祝你好運。 – shellter 2014-11-03 02:44:20

+0

我已經複製/粘貼了你的代碼,並且在我的結尾運行正常。我也打開了驗證來仔細檢查,參數傳遞正常: '[oracle @ dbsgoel1 gvenzl] $ ./wrapping_shell_script.sh tiger Mon Nov 3 10:50:00 GMT 2014 Enter an empno : ENAME ---------- SCOTT' 隨着覈實: '甲骨文@ dbsgoel1 gvenzl] $ ./wrapping_shell_script.sh虎 週一11月3日十時50分27秒格林尼治標準時間2014 輸入empno:old 3:WHERE TO_CHAR(e.empno)='&abc' new 3:WHERE TO_CHAR(e.empno)='7788' ENAME ---------- SCOTT' – gvenzl 2014-11-03 09:07:15

+0

我建議設置驗證並檢查參數是否成功傳遞。也許通過複製/粘貼sql腳本如果你不允許修改它。 – gvenzl 2014-11-03 09:11:40

回答

0

找到問題後,總是很容易,但VERIFY選項創建用於調試變量設置。鑑於你不能改變調用SQL文件,但你可以改變(G)的login.sql的事實,你可以設置:

set verify on 

但是,只有尋找其他選項均設置unexpectingly。

0

它對我來說也很好。我想知道,你是否檢查查詢實際上是否會返回一行7781?

1

樓主這裏....

謝謝大家,確認我的做法應該工作過。

我做了一些挖掘,並且,由於info at this link,我發現在執行代碼時有效的login.sql包含SET DEFINE OFF

通過在調用Oracle腳本之前在shell腳本中添加SET DEFINE ON,我的代碼成功完成。

再次感謝提示!

0

@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