2014-02-25 65 views
0

我在包中編寫存儲過程時遇到困難。下面是我在包外部編譯好的存儲過程,但我相信需要在包體內以不同的方式寫入。我承認這是一個使用包我的第一次......包含參數的存儲過程的新Oracle包

create or replace PROCEDURE SP_COMMENT(P_MEMBER_ID IN VARCHAR2, P_MEMBER_LASTNAME IN 
VARCHAR2, P_MEMBER_FIRSTNAME IN VARCHAR2, P_MEMBER_STARTDATE IN DATE, 
P_MEMBER_ENDDATE IN DATE, P_PRODUCT_CAT_CODE IN VARCHAR2, P_COMMENT IN VARCHAR2,  
COMMENT_CURSOR out sys_refcursor) 

AUTHID CURRENT_USER 
IS 
BEGIN 

EXECUTE IMMEDIATE 
'INSERT INTO TEST 
(
MEMBER_ID, 
MEMBER_LASTNAME, 
MEMBER_FIRSTNAME, 
MEMBER_STARTDATE, 
MEMBER_ENDDATE, 
PRODUCT_CAT_CODE, 
COMMENTS 
) 
VALUES 
(
p_member_id, 
p_member_lastname, 
p_member_firstname, 
p_member_startdate, 
p_member_enddate, 
p_product_cat_code, 
p_comment)'; 

commit; 
open COMMENT_CURSOR for select * from sconti.TEST; 
END; 

下面是我開始的包,這是行不通的:

CREATE OR REPLACE 
PACKAGE COMMENT_TEST IS 

    PROCEDURE SP_COMMENT(P_MEMBER_ID IN VARCHAR2, P_MEMBER_LASTNAME IN VARCHAR2, 
    P_MEMBER_FIRSTNAME IN VARCHAR2, P_MEMBER_STARTDATE IN DATE, 
    P_MEMBER_ENDDATE IN DATE, P_PRODUCT_CAT_CODE IN VARCHAR2, P_COMMENT IN VARCHAR2, 
    COMMENT_CURSOR out sys_refcursor) IS 
    BEGIN 

    EXECUTE IMMEDIATE 
    'INSERT INTO TEST 
    (
    MEMBER_ID, 
    MEMBER_LASTNAME, 
MEMBER_FIRSTNAME, 
MEMBER_STARTDATE, 
MEMBER_ENDDATE, 
PRODUCT_CAT_CODE, 
COMMENTS 
) 
    VALUES 
    (
    p_member_id, 
    p_member_lastname, 
    p_member_firstname, 
p_member_startdate, 
p_member_enddate, 
p_product_cat_code, 
p_comment)'; 

commit; 
open COMMENT_CURSOR for select * from sconti.TEST; 
END; 

    END COMMENT_TEST; 

我期待任何迴應,以幫助我....謝謝!

+1

請參閱本Oracle文檔瞭解如何創建包http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/09_packs.htm –

+0

從第一看你似乎缺少概念'create package'和'create package body'。檢查先前評論中的文檔。這是直截了當的東西。 –

+0

謝謝你的鏈接..這是非常有益的...我一直在網上搜索信息。 – user3351718

回答

1

我不能肯定地說(因爲你沒有分享你得到的錯誤),但最基本的錯誤是缺乏對規範/正文的理解。

您已將代碼放入包規範中,而不是正文中。規範應該只有程序聲明(即沒有0​​和end),其中正文包含程序的全部內容。

儘管它不會影響編譯,但還有一個問題:字符串中的SQL無法訪問提供給該過程的參數。如果您必須使用動態SQL(在這種情況下絕對沒有理由),那麼您需要一個using子句將該變量綁定到動態語句中。此外,使SQL成爲靜態將允許在編譯時驗證SQL語句,這具有明顯的優勢。

修改後的包裝(規格和正文)如下。

CREATE OR REPLACE PACKAGE comment_test IS 
    PROCEDURE sp_comment (p_member_id IN VARCHAR2, 
         p_member_lastname IN VARCHAR2, 
         p_member_firstname IN VARCHAR2, 
         p_member_startdate IN DATE, 
         p_member_enddate IN DATE, 
         p_product_cat_code IN VARCHAR2, 
         p_comment IN VARCHAR2, 
         comment_cursor OUT SYS_REFCURSOR); 
END comment_test; 
/

CREATE OR REPLACE PACKAGE BODY comment_test IS 
    PROCEDURE sp_comment (p_member_id IN VARCHAR2, 
         p_member_lastname IN VARCHAR2, 
         p_member_firstname IN VARCHAR2, 
         p_member_startdate IN DATE, 
         p_member_enddate IN DATE, 
         p_product_cat_code IN VARCHAR2, 
         p_comment IN VARCHAR2, 
         comment_cursor OUT SYS_REFCURSOR) IS 
    BEGIN 
     INSERT INTO test (member_id, 
         member_lastname, 
         member_firstname, 
         member_startdate, 
         member_enddate, 
         product_cat_code, 
         comments) 
     VALUES  (p_member_id, 
        p_member_lastname, 
        p_member_firstname, 
        p_member_startdate, 
        p_member_enddate, 
        p_product_cat_code, 
        p_comment); 

     COMMIT; 

     OPEN comment_cursor FOR SELECT * FROM sconti.test; 
    END; 
END comment_test; 
/
+0

我很欣賞反饋...我有動態sql參數,因爲此過程將用於Cognos內部,以提供回寫功能..我已經使用SQL Server完成了一些操作,但與Oracle無關。在編輯SPECS和BODY之後,我遇到的問題是它在主體開頭的'CREATE'這個詞上出錯。 – user3351718

+0

另外...我完全同意我的錯誤和問題與我沒有清楚地瞭解包裝BODY和規格有關聯的事實!這個線程幫助了我很多。 – user3351718

+0

上面提到的完整錯誤如下: 錯誤(13,1):PLS-00103:遇到符號「CREATE」 – user3351718

相關問題