2012-12-07 51 views
4

我想爲包打下基礎,但即使入門也遇到困難。我已經成功創建了一個基本的包規範,並且只想測試包體,但是我無法編譯它。該規範的代碼是:創建Oracle包體

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