1

두 개의 .sql 파일은 모두 입력 매개 변수를 사용하는 Oracle 저장 프로 시저입니다. 먼저 커맨드 라인에서 sqlplus를 사용하여 원격 오라클 데이터베이스에 연결하고 싶습니다. 먼저 두 파일을 사용하여 각각의 저장 프로 시저를 생성하고 Oracle SQL Developer에서 해당 연결에 대한 프로 시저를 참조하십시오.Oracle 저장 프로 시저 만들기 및 .sql 파일에서 실행

이 후 나는 이처럼 보이고 입력 매개 변수를 가져 와서 저장 프로 시저를 실행하도록 설계된 .sql 파일이 두 개 더 있습니다. 이것은 저장 프로 시저 "REPORT"를 실행하기위한 파일 중 하나입니다. 나는이 출력 얻을 때 사용자 이름/암호 @의 report_setup.sql

SQLPLUS \ 사용자 \ 바탕 화면> : C :

DECLARE 
    NAME VARCHAR2(200); 
    VERSION VARCHAR2(200); 
    STARTDATE DATE; 
    ENDDATE DATE; 
BEGIN 
    NAME := '&1'; 
    VERSION := '&2'; 
    STARTDATE := '&3'; 
    ENDDATE := '&4'; 

    exec REPORT(NAME, VERSION, STARTDATE, ENDDATE); 
    EXCEPTION 
    WHEN OTHERS THEN 
    RAISE_APPLICATION_ERROR(-20101,SQLERRM); 
    END; 
/

명령 프롬프트에서 나는 처음으로 데이터베이스에 저장 프로 시저를 만들려고 번호가 매겨진 빈 줄과 내 .sql 파일의 마지막 줄보다 큰 숫자부터 시작하는 줄입니다. 내 report_setup.sql 파일의 길이는 81 줄이고 sqlplus 명령의 출력은 83부터 시작하는 빈 번호 매기기 라인입니다.

sqlplus를 통해 이러한 저장 프로 시저를 올바르게 만들고 실행할 수있는 방법을 알려주십시오. 사전에

감사합니다,

답변

2

나는 당신이 'exec' 단어를 제거해야 생각하고, 그것의 앞에 공백없이 라인의 매우 시작시 맨 아래에있는 슬래시을 가지고 결정적 :

DECLARE 
    NAME VARCHAR2(200); 
    VERSION VARCHAR2(200); 
    STARTDATE DATE; 
    ENDDATE DATE; 
BEGIN 
    NAME := '&1'; 
    VERSION := '&2'; 
    STARTDATE := '&3'; 
    ENDDATE := '&4'; 

    REPORT(NAME, VERSION, STARTDATE, ENDDATE); 
EXCEPTION 
    WHEN OTHERS THEN 
    RAISE_APPLICATION_ERROR(-20101,SQLERRM); 
END; 
/
+0

좋은 자리; 그래도 문제의 설명을 이해하면 아직이 블록을 실행하지 못했습니다. 또한'startdate'와'enddate'를 설정할 때 암시 적으로 날짜 변환을한다는 점을 지적 할 수도 있습니다. (어쨌든 선언하고 설정하는 것 같지 않습니다.) 언젠가는 실패 할 것입니다. –

1

그것은 생성하는 프로 시저를 호출하는 스크립트보다 report_setup.sql를 표시하는 것이 더 유용 ...하지만 것이다 당신이 설명하는 증상의 report_setup.sqldoesn't have a / at the end of the procedure declaration에서.

그것은 아마도 무언가 같이있다 : 그것은 당신이 @ 사용하여 명령 줄에서 실행중인 때문에

... 
BEGIN 
    ... 
END REPORT; 
/

을 가질 필요가

CREATE OR REPLACE PROCEDURE REPORT(NAME VARCHAR2, VERSION VARCHAR2, 
    STARTDATE DATE, ENDDATE DATE) AS 
... 
BEGIN 
    ... 
END REPORT; 

그것은 또한 끝에 EXIT을 가져야한다; 그러나 컴파일되지 않은 절차의 일부로 취급 될 /이 없습니다.

-s 플래그를 사용하여 SQL * Plus를 호출하여 회선 번호 표시를 억제 할 수 있습니다. 그러나 문제가 대략적으로 표시되므로 유용합니다.