2014-02-25 29 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

相关问题