2011-02-10 10 views
6

내 요구 사항은 내 셸 스크립트의 변수에 sqlplus 작업 결과를 저장하는 것입니다. 나는 이미 SQLPlus 결과를 쉘 변수에 저장하는 방법

testvar = 'sqlplus 'user/pwd' 
@test.sql' 

을 시도했지만 작동하지 않는

sqlplus 'user/pwd' @test.sql 

내의 .sh 파일에 다음과 같은 연산의 결과가 필요합니다.

편집 :

나는

testvar=sqlplus foo/[email protected] @test.sql 

로 변경 그리고 내가

함께 노력

SQL*Plus:: not found [No such file or directory]

말한다

그리고 같은 오류가 발생합니다. 나는

+0

Bourne 유형 쉘 (bash와 같은)에서 구문은'='주위의 공백을 허용하지 않습니다. –

답변

9

을 이용하여야 역 따옴표 잘 작동

sqlplus foo/[email protected] @test.sql 

아래처럼 변수에 할당하지 않고 시도 할 때 :

testvar=`sqlplus foo/bar @test.sql` 

또는 그 구문 눈에 거슬리는이어야합니다 :

testvar=$(sqlplus foo/bar @test.sql) 

당신에게 superflu를 제한하기 위해 올바른 sql * plus 명령을 사용하는 것이 분명합니다. 출력은? :) 물론 백틱이 출력의 공백을 무너 뜨릴 것이라고 조심하십시오.

+1

"백틱이 출력의 공백을 붕괴시킵니다."- 그렇지 않습니다. 그것은 단지 후행 줄 바꿈을 제거합니다. 또한,'$()'를 사용하는 것이 낡은 것이 아닙니다. –

+1

다른 방법은 다음과 같습니다. backticks는 "old school"입니다. 할당시 공백을 잃지 않습니다. 변수가 따옴표로 묶이지 않으면 출력시 손실됩니다. –

+0

예,'$()'에 대해 정확합니다. 실제로 나중에 다른 옵션을 추가하기 위해 편집했고 전환하는 것을 잊었습니다. – Xailor

1

$() 내의 명령이 서브 쉘에서 실행될 때 sqlplus를 호출하는 데 필요한 모든 것이 있는지 확인하십시오. 지금 당장 분명히 PATH 문제가 발생했습니다.

13

대신을 시도해보십시오

testvar=`sqlplus -s foo/[email protected] <<EOF 
set pages 0 
set head off 
set feed off 
@test.sql 
exit 
EOF` 

-s 스위치는 모든 헤더 정보 때를 SQLPLUS 출시 꺼집니다. 또한 피드백, 헤더 및 페이지 크기를 0으로 설정하고 싶습니다. 저는 낡은 학교이기 때문에 나는 아직도 백개미드를 사용합니다.

+0

은 매개 변수를 전달할 때 확인을 추가해야합니다. – agonen

+0

감사합니다. 나는 이와 같은 문법을 찾고 있었다. 나는 SQL 파일을 사용하고 싶지 않았다. –

0

여기 해결책은 모두 해킹입니다. 당신의 SQL 파일은 다음과 같이한다

...

set termout off 
set showmode off 
set heading off 
set echo off 
set timing off 
set time off 
set feedback 0 
set pagesize 0 
set embedded ON 
set verify OFF 

spool courses.sh 
SELECT 'term="' || sfrstcr_term_code || '";', 'subj="' || sfrstcr_subj_code || '";' FROM sfrstcr WHERE sfrstcr_pidm = 1234567; 
spool off 

다음 쉘 스크립트를 읽고 쉘 환경 변수를 인쇄합니다.

while read -r row; do 
    eval "$row" 
    echo "term=$term"; 
    echo "subj=$subj"; 
done < courses.sh 

읽기 명령은 루프 당 각 DB 행을 읽을 수 있도록 모든 변수가 한 줄에 있어야합니다.

+0

@trenton-d-adams termout off - 터미널에 표시되지 않음을 의미합니다. 나는 당신이 스풀 명령을 사용하지 않는 한 그것을 놔두는 것이 더 좋다고 생각한다. – agonen

관련 문제