2013-02-05 2 views
0

더 많은 옵션을 허용하기 위해 기존 SQLPLUS 스크립트의 일부를 쉘 스크립트로 변경하라는 요청을 받았습니다. SQLPLUS 프롬프트 라인에 도달하면쉘 스크립트에서 sqlplus로 입력을 전달하는 방법은 무엇입니까?

#!/bin/sh 

echo "Please enter database username" 
read eval_user 
echo "Please enter database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF >> ${LOGFILE} 
connect $eval_user/[email protected]$db_name 

set serveroutput on format wrapped 
set pages 0 lines 300 trimout on trimspool on 
set echo off feedback off sqlprompt '' 

SPOOL results.txt; 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
PROMPT 
SET VERIFY OFF; 
SET SERVEROUTPUT ON; 

ACCEPT continue_flag CHAR PROMPT 'Are You ready to continue Y/N? ' 
PROMPT 

내가이 오류 :

SPOOL results.txt; 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
PROMPT 
PROMPT This script upgrades the database to the most recent version of eV8.0. 
SET VERIFY OFF; 
SET SERVEROUTPUT ON; 

ACCEPT continue_flag CHAR PROMPT 'Are You ready to continue Y/N? ' 
PROMPT 

내 쉘 스크립트가 지금처럼 보인다 : 여기

원래 SQLPLUS 스크립트에 대한 메시지를 표시 한 것입니다

Are You ready to continue Y/N? You have entered an invalid response. Exiting. 
BEGIN 
* 
ERROR at line 1: 
ORA-06501: PL/SQL: program error 
ORA-06512: at line 13 

저는 sqlplus를 처음 사용하기 때문에 설정 한 설정과 관련이 있다는 것을 알고 있습니다. 내가 sqlprompt에서 피드백 에코를 설정하면 처음에. 그러나 줄을 제거하면 스크립트가 멈 춥니 다.

프롬프트를 SQLPLUS에서 완전히 꺼내서 셸 부분에서만 사용해야합니까?

+1

DB 스크립트와 함께 사용하는 트릭 중 하나는 SQL을 생성하고 실행하고자 할 때''sqlplus''를 통해 파이프하는 스크립트를 얻는 것입니다. Python/Perl의 모든 기능을 사용하여 스크립트 생성기가 복잡해질 수 있다는 이점이 있습니다. 그것은''echo rm afile.txt''와 비슷한 것으로서 출력을 확인한 다음''echo rm afile.txt | sh''를 사용합니다. – sotapme

답변

2

가장 쉬운 방법은 SQL 스크립트와의 상호 작용을 유지하는 것입니다. 현재는 알려주지 않은 것을 읽으 려합니다. 이 문서는 변수를 전달하는 좋은 방법입니다. 셸 특수 문자에 미치는 영향을 잊지 마십시오 ... 항상 그렇듯이 더 많은 방법으로 동일한 작업을 수행 할 수 있습니다.

네, 질문에 대한 답변 : 예, 상호 작용을 취하고 호출 쉘에서 결정을 준비하십시오.

+0

쉘 스크립트가 실행될 때 SQLPLUS 스크립트의 출력을 화면으로 리디렉션 할 수 있습니까? 아니면, 우리의 유일한 선택을 감추고 있습니까? – roymustang86

+0

예, 표준 출력으로 스풀링 할 수 있습니다. 문제가 없으며 리다이렉트하지 마십시오. 특정 결과를 얻으려면 스풀을 사용하십시오. termout을 off로 설정하지 않는 한 출력은 stdout에 기록됩니다. –

+0

sqlplus에서 생성 된 오류를 어떻게 catch합니까? ORA처럼? – roymustang86

관련 문제