2014-11-03 1 views
2

Korn 쉘 스크립트에서 SQL * Plus (10g) 스크립트를 호출하려고합니다.쉘 스크립트에서 ACCEPT를 포함하는 SQL * Plus 스크립트에 매개 변수 전달

SQL * Plus 스크립트를 수정할 수 없으며 SQL * Plus ACCEPT 명령이 포함되어 있습니다.

이 ACCEPT 명령 변수 (7788)에 대한 고유 한 인수를 Korn 쉘 스크립트를 통해 SQL * Plus 스크립트에 전달하려고합니다.

#!/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 
:

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

그리고 여기이 전화를 만들기 위해 Korn 쉘 스크립트 (wrapping_shell_script.sh)에서 내 시도 : 여기

oracle_code.sql은 SQL * Plus를 스크립트의 깍 다운 버전입니다

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

$ 
,369 :

은 여기가 내가 Korn 쉘 명령 행에서 쉘 스크립트를 실행할 때의 모습입니다

7788 값은 SQL * Plus 스크립트의 abc 어휘 매개 변수로 전달되지 않습니다.

지정하는 값이 전달되고 호출 된 SQL * Plus 스크립트가 실행되도록 Korn 셸 스크립트를 어떻게 변경합니까?

감사합니다.

+0

+1 잘 형성된 질문의 경우입니다. 이것은 괜찮아 보입니다, 제 생각에는 sqlplus가 stdin 대신에 키보드 (또는 똑같이 대다수)를 읽는 것입니다. 하지만, 확실하게하려고 했습니까? echo 7788 | sqlplus ...'? 행운을 빕니다. – shellter

+0

코드를 복사/붙여 넣었습니다. 코드가 제대로 실행됩니다. 또한 확인을 위해 이중 확인을 설정했으며 매개 변수가 잘 전달되었습니다. '[oracle @ dbsgoel1 gvenzl] $ ./wrapping_shell_script.sh tiger Mon 11 월 3 일 10:50:00 GMT 2014 empno 입력 : ENAME ---------- SCOTT' 와의 확인 : '[오라클 @ dbsgoel1 gvenzl] $ ./wrapping_shell_script.sh 호랑이 월 11월 3일 그리니치 표준시 10시 50분 27초 2014 empno 입력 : 이전 3 : WHERE TO_CHAR (e.empno) = '& abc' new 3 : WHERE TO_CHAR (e.empno) = '7788' ENAME ---------- SCOTT' – gvenzl

+0

나는 확인을 설정하고 매개 변수가 성공적으로 전달되었는지 확인하는 것이 좋습니다. 아마도 당신이 그것을 수정할 수없는 경우 SQL 스크립트를 복사/붙여 넣기하여. – gvenzl

답변

0

문제가 발견되면 항상 쉽지만 변수 설정을 디버깅하려면 VERIFY 옵션이 만들어졌습니다. 단지 다른 옵션 unexpectingly 설정된 찾으려면

set verify on 

을하지만 : 당신은 호출하는 SQL 파일을 변경할 수 있지만, 당신은 (g) login.sql을 변경할 수있는 사실을 감안할 때, 당신은 설정할 수 있습니다.

0

나를 위해 잘 작동합니다. 궁금한데, 쿼리가 실제로 7781 행을 반환하는지 확인 했습니까? 내 접근 일한 것을 확인하는

1

여기에 원래 포스터 ....

감사합니다, 모두.

info at this link 덕분에 코드를 실행 한 시점에 적용한 login.sqlSET DEFINE OFF이라는 것을 발견했습니다.

오라클 스크립트를 호출하기 전에 쉘 스크립트에 을 추가하면 코드가 성공적으로 완료되었습니다.

힌트를 보내 주셔서 다시 한번 감사드립니다.

0

@Tebbe 매력처럼 작동했습니다. 감사합니다.

나는이 스레드가 오래 알고 있지만 단지의 경우는 다른 사람의 도움 :

여기

내가 변수를 수용하고 동의 진술 한 쌍을 전달하는 테베의 스크립트에서 만든 수정 된 버전입니다.참고, 난 어려운 방법을 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