2013-05-14 6 views
0

경로명이 문자열로 전달되는 SQLPlus에서 스크립트를 어떻게 실행합니까? 다음과 같은 뭔가 (실패) : 명령 프롬프트에서 다음오라클 : 동적으로 스크립트 선택

sqlplus my_username/[email protected] %* 

a의 SQL-내용을 실행 :

SET SERVEROUTPUT ON; 
DECLARE 
    path VARCHAR2(128); 
BEGIN 
    path := '<runtime_path>' || 'test_script.sql'; 
    dbms_output.put_line(path); 
    @ path; 
END; 
/
+0

왜 Oracle 내에서 실행하고 있습니까? 스크립트 일 필요가있는 경우 스케줄러를 사용하지 않는 이유는 무엇입니까? 스크립트 일 필요가없는 경우 패키지/프로 시저에 배치하고 데이터베이스 내에서이를 스케줄하십시오. 귀하의 질문에 대한 답변으로 당신 clob에 그것을 읽고 dbms_sql을 사용하여 실행 ... 그것은 단순한 절차 또는 cron 전화해야 무엇에 대한 거대한 잔인한 것 같아. – Ben

+0

@Ben, 이것은 개발 환경입니다. 우리는 다른 소프트웨어 구성 요소의 유효성 검사를위한 스키마를 빌드하는 외부 그룹의 수백 개의 한 줄 DDL 스크립트를 가지고 있습니다. – ThomasMcLeod

+0

나는 오라클에서 왜 그렇게해야하는지 아직 모르겠다. 수백 가지가 있다면 그 모든 것을 하나의 쉘 스크립트에 넣고 실행하십시오. 당신이 원한다면'grep'과'awk'를 적절히 사용하여 한줄로 모두 실행할 수 있습니다 ... – Ben

답변

2

당신은 SQLPLUS에 매개 변수를 전달할 수 있지만 SQLPLUS 명령으로 PL/SQL을 혼합 할 수 없습니다. 그래서 당신의 모범은 날지 않을 것입니다. 따라서 쉘 스크립트로 포장해야 할 수도 있습니다. 그러나 PL/SQL 루틴을 살펴보면 경로를 추가하려고 시도합니다. 어쩌면 이것은 가능합니다.

호출이

sqlplus user/[email protected] @genericscript.sql path 

같은 SQLPLUS 그리고 다음 같이 myscript.sql 다음

select 'hello welt' from dual; 

그래서 내가 가진이 내용이 내 예에서 genericscript.sql

SET SERVEROUTPUT ON 
start &1.myscript.sql 
quit 

내 SQLPlus의 출력

[[email protected] sqp]$ sqlplus user/[email protected] @genericscript.sql /home/oracle/sqp/ 

SQL*Plus: Release 11.2.0.2.0 Production on Tue May 14 22:53:15 2013 

Copyright (c) 1982, 2010, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 


'HELLOWELT 
---------- 
hello welt 

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

희망이 있습니다. SQLPLUS 참조 매뉴얼을 볼 수 있습니다.

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_five.htm#autoId13

은 내가 PDF를 선호

http://docs.oracle.com/cd/E11882_01/server.112/e16604.pdf

+0

이것은 기술적으로 질문에 대답하지 않습니다 ... 그리고 만약 주석에 따라 OP가 자동으로이를 원할 수도 있다고 생각하는 수백 가지가 있습니다. _ "그래서 중첩 된 스크립트의 경로를 실제로 선택하고 싶습니다."_ – Ben

+0

@Ben 맞아요. PL/SQL과 SQLPLUS 명령을 혼합 할 수는 있지만 그렇지 않습니다. 그래서 나는이 점을 분명히 할 것이다. – hol

+0

일종의 Java를 사용할 수 있습니다. – Ben

0

내가 Windows에서 그것을 할 방법이 포함 된 BAT 파일을 생성한다 파일, 난 그냥 입력 :

batfile.bat @myfile.sql 
+0

OP는 Linux를 사용하고 있지만 ... 쉘 스크립트에서도 똑같이 작동합니다. 또한 기술적으로 질문에 대답하지도 않습니다. OP가 자동으로 수행하기를 원할 수도 있다고 의심되는 사람이 수백 명이있는 경우에는 "따라서 중첩 된 스크립트의 경로를 실제로 선택하려고합니다."라고 덧붙입니다. - 벤 그냥 지금 – Ben

+0

편집 난 게시 한 후 리눅스 코멘트를 보았지만 다른 사람이 아이디어를 훔치고 더 나은 대답을 줄 수 있도록 내 대답을 떠날하기로 결정했습니다 : – Ronnis

1

하나의 옵션 : 너무, 매우 편리 익명 블록에서

D:\>type run.sql 
col p new_value path noprint 
select '&1.' as p from dual 
/

@&path 
D:\>type run1.sql 
select 'This is run1' from dual 
/
D:\>sqlplus hr/[email protected] @run.sql d:\run1.sql 

SQL*Plus: Release 11.2.0.1.0 Production on Wed May 15 13:24:22 2013 

Copyright (c) 1982, 2010, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production 




Elapsed: 00:00:00.03 

'THISISRUN1' 
------------ 
This is run1 

Elapsed: 00:00:00.01 

그리고 당신은 인라인 할 수있는 스크립트 :

D:\>sqlplus hr/[email protected] @parent.sql d:\child.sql 

SQL*Plus: Release 11.2.0.1.0 Production on Wed May 15 13:31:46 2013 

Copyright (c) 1982, 2010, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production 

currently spooling to S:\spool\sandbox\20130515_1331_HR_33.log 
this is child script called from parent's anonymous plsql block 
child's name was passed using command line parameter 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:00.00 
13:31:47 [email protected]> get parent 
    1 begin 
    2 @&1. 
    3* end; 
13:31:48 4 . 
13:31:48 [email protected]> get child 
    1 dbms_output.put_line('this is child script called from parent''s anonymous plsql block'); 
    2* dbms_output.put_line('child''s name was passed using command line parameter'); 
13:31:50 [email protected]> 
0

PL/SQL에서 실행 파일을 실행하는 유일한 방법은 EXECUTABLE 유형의 scheduler program을 동적으로 만들고 작업을 예약하는 것입니다.