2014-12-11 1 views
1

나는 Bash에 루프를 가지고있다. 그것은 오늘날까지 매력처럼 작동하고 있었다. 같은 루프는 같습니다SQLPlus에서 세션을 활성 상태로 유지하고 동일한 세션에 다시 연결할 수 있습니까? BASH-related

SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',numbers) 

지금 - 패키지가 그것으로 무엇을해야하고 있던 때까지

while read line1 ; do 
    while read line2 ; do 
     stringArray=($line2) 
     string=$line1.${stringArray[1]} 

     sqlplus /nolog <<EOF 
     connect sysuser/[email protected]_instance 
     alter system flush shared_pool; 
     quit 
     EOF 

     sqlplus -s /nolog > /dev/null 2>&1 <<EOF 
     connect user/[email protected]_instance 
     variable rc refcursor; 
     SPOOL ${line1}_${stringArray[0]}.DATA 
     exec :rc := $string; 
     print rc; 
     spool off 
     exit 
     EOF 

    done < file2.txt 
done < file1.txt 

한 가지를 명확히하기 위해, 변수 $string의 내용은 기능 및 매개 변수와 오라클 패키지는 단지 하나의 매개 변수가있는 실행 - 모든 것이 완벽하게 좋았습니다. 하지만 이제는 5 단계로 작업을 수행하는 패키지를 만났습니다. 마지막 단계에서 결정된 단계가 있습니다. 최종의 1,

SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',1) 
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',2) 
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',3) 
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',4) 
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',5) 

첫번째을 다른 작업 (2 내지 5)가 작동되는 TEMPORARY_TABLE에서 제조된다 : 이것은 다음과 같다. 작업 번호 5는 전체 체인의 결과도 제공해야합니다.

작업을 1 단계로 수행 할 때까지는이 루프를 실행하는 것이 완벽했습니다. 그러나 TEMPORARY_TABLE은 연결을 끊은 후에 사라지기 때문에,이 패키지의 bash 스크립트에 특별한 섹션을 추가 할 수는 없으므로 훨씬 많은 패키지가있을 수 있고 단계 수가 다릅니다. 이 스크립트를 사용하는 사용자의 노력없이 자동으로 수행해야합니다.

세션을 유지하는 방법이 있습니까? 아니면 다른 방법이 있습니까?

+0

코 프로세스에서'sqlplus'를 실행하십시오. – Barmar

+0

각 실행에 대해 새 임시 테이블을 만드는 것이 Oracle에서 임시 테이블을 사용하는 올바른 방법이 아닙니다. Oracle에서 임시 테이블은 다른 데이터베이스보다 영구적입니다. 예 : http://stackoverflow.com/q/2671518/272735 임시 란 테이블의 수명이 아니라 행의 수명을 의미합니다. – user272735

+0

정말 다른 SQL 세션이 필요한 경우 임시 테이블로 사용되는 일반 테이블을 만들지 않겠습니까? 나중에 수동으로 삭제해야하지만 다른 세션의 사용에는 문제가 없습니다. 테이블의 이름이 매우 구체적임을 반드시 확인해야합니다. – tvCa

답변

0

단일 프로 시저 호출을 $string에 저장하는 대신 익명 블록을 변수에 쓰고 실행하십시오. 블록은 다른 것들과 함께 프로 시저에 대한 여러 호출을 포함 할 수 있으며, 모두 완료 될 때까지 리턴하지 않습니다.

+0

좋은 생각 인 것 같지만 시작할 수있는 단서가 없습니다. 나는 전체 프로 시저, 또는'variable rc refcursor; 스풀 $ {line1} _ $ {stringArray [0]}. 데이터 exec : rc : = $ string; 인쇄 rc; '$ string'에서 스풀을 끈다 고요? – dziki

+0

'BEGIN ... END' 블록 내에 필요한 PL/SQL 문을 작성할 수 있습니다. 그리고이 블록은 엄밀히 말하면 문자열이기 때문에 클라이언트에서 동적으로 생성 한 다음 실행을 위해 서버로 보낼 수 있습니다. 그러나 기억해야 할 점은 서버에서 실행 중이므로 SPOOL 문 (SQL * PLUS 문)을 사용할 수 없다는 것입니다. 당신은'DBMS_OUTPUT'을 사용해야 할 것입니다. –