2012-12-07 2 views
4

패키지의 기초를 다지려고하는데 시작하기가 어려워요. 나는 기본 패키지 스펙을 성공적으로 작성했으며 패키지 바디를 테스트하려고하지만 컴파일하는 데 문제가 있습니다.오라클 패키지 본체 생성

CREATE OR REPLACE PACKAGE synchronize_my_data 
AS 
    PROCEDURE synchronize_data(p_run_date IN date); 
END synchronize_my_data; 

여기 패키지 본체 코드 : 사양 코드는

CREATE OR REPLACE PACKAGE BODY synchronize_my_data 
IS 
    PROCEDURE synchronize_data(p_run_date IN date) IS 
     PROCEDURE process_deletes(p_run_date IN date) IS 
     BEGIN 
      dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));  
     END process_deletes; 
    BEGIN 
    process_deletes(p_run_date); 
    END synchronize_data; 

END synchronize_my_data; 

내가 컴파일 오류가 계속하지만, 코드 뭐가 잘못 알아낼 수 없습니다. 기본 코드처럼 보입니다. 나는 분명히 뭔가 빠져 있습니까?

+3

아마도 컴파일 오류를 알려주지 못하셨습니까? –

+1

변경 사항없이 여기에서 작동합니다. dbms_output을 실행할 권한이없는 것입니까? –

+0

내 잘못, 내가 컴파일 오류를 게시해야합니다. 나는 ammoQ를 못 박았다고 생각합니다. ebms_output을 실행할 권한이 없었습니다. dba로 로그인하여 실행하고 잘 실행했습니다. 해답 및 코딩 제안에 감사드립니다. – user1408057

답변

7

그 코드는 나를 위해 컴파일하는 것 같습니다. 어떤 오류가 발생하고 있습니까?

SQL> CREATE OR REPLACE PACKAGE synchronize_my_data 
    2 AS 
    3 PROCEDURE synchronize_data(p_run_date IN date); 
    4 END synchronize_my_data; 
    5/

Package created. 

SQL> CREATE OR REPLACE PACKAGE BODY synchronize_my_data 
    2 IS 
    3 PROCEDURE synchronize_data(p_run_date IN date) IS 
    4  PROCEDURE process_deletes(p_run_date IN date) IS 
    5  BEGIN 
    6   dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY')); 
    7  END process_deletes; 
    8 BEGIN 
    9  process_deletes(p_run_date); 
10 END synchronize_data; 
11 
12 END synchronize_my_data; 
13/

Package body created. 

일반적인 문체의 관점에서 볼 때 일반적으로 패키지 본문의 다른 프로 시저 내에 프로 시저를 정의하는 것은 거의 의미가 없습니다. 패키지 사용의 이점 중 하나는 공공 및 비공개 절차를 모두 가질 수 있다는 것입니다. process_deletes 프로 시저를 사양에서 정의하지 않고 본문에서 정의하여 전용 프로 시저로 만들 수 있습니다.

CREATE OR REPLACE PACKAGE BODY synchronize_my_data 
IS 
    PROCEDURE process_deletes(p_run_date IN date) 
    IS 
    BEGIN 
     dbms_output.put_line('Run Date: ' || to_char(p_run_date, 'MM/DD/YYYY'));  
    END process_deletes; 

    PROCEDURE synchronize_data(p_run_date IN date) 
    IS 
    BEGIN 
    process_deletes(p_run_date); 
    END synchronize_data; 

END synchronize_my_data; 

오류가 발생해도 아무런 관련이 없습니다. 하지만 코드를 다루기 쉽도록해야합니다.

+0

다른 프로 시저 내의 프로 시저는 외부 프로 시저의 로컬 변수를 확인합니다.이 프로 시저는 매개 변수가 많은 프로 시저를 피할 때 유용 할 수 있습니다. –

+0

@ammoQ - 사실, 내가 "항상"보다는 "일반적으로"라고 말한 이유입니다. 다른 프로 시저로 넘기는 지역 변수가 너무 많아서 프로 시저가 너무 많아서 별도의 프로 시저로 처리해야 할 필요성을 느껴야하는 경우, 100 번에서 99 번, 나는 아키텍처를 조금 재고하고 상대적으로 적은 수의 매개 변수로 여러 개인 절차로 분해해야합니다. –

+1

"일반적으로 패키지 본체에서 다른 프로 시저 내의 프로 시저를 정의하는 것은 거의 의미가 없습니다."전혀 동의하지 마십시오. 필자는 패키지 내에서 개인 프로 시저를 사용하여 여러 코드에 의해 호출되는 공통 코드를 유지합니다. 단일 코드로 코드를 구성하는 절차를 사용합니다. 이상적인 것은 실행 가능한 코어를 전체적으로 볼 수 있지만 무거운 모듈화에 의해서만 달성 할 수있는 "메인"프로그램 유닛의 경우입니다. 서브 루틴이 하나의 프로그램 유닛 만 호출 할 수 있으면 그 유닛의 선언 섹션에 – APC