【问题标题】:New Oracle Package with Stored Procedure Including Parameters具有包含参数的存储过程的新 Oracle 包
【发布时间】:2014-03-27 20:51:40
【问题描述】:

我在包中编写存储过程时遇到了困难。下面是我的存储过程,它在包外编译得很好,但我认为需要在包体内以不同的方式编写。我承认这是我第一次使用包......

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;

我期待任何回复以帮助我....谢谢!

【问题讨论】:

  • 关于如何创建包请参考这个Oracle文档docs.oracle.com/cd/B10500_01/appdev.920/a96624/09_packs.htm
  • 乍一看,您似乎缺少create packagecreate package body 的概念。检查上一条评论中的文档。这是直截了当的东西。
  • 感谢您的链接。它非常有帮助...我一直在网上搜索信息。

标签: oracle stored-procedures packages


【解决方案1】:

我不能肯定地说(因为你没有分享你得到的错误),但最基本的错误是缺乏对规范/正文的理解。

您已将代码放入包规范中,而不是正文中。规范应该只有过程声明(即没有beginend),因为主体包含过程的全部内容。

虽然它不会影响编译,但还有一个问题:字符串中的 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;
/

【讨论】:

  • 感谢您的反馈...我有动态 sql 参数,因为此过程将在 Cognos 中用于提供回写功能...我在 SQL Server 上做过的事情,但在 Oracle 上没有。我在编辑 SPECS 和 BODY 后面临的问题是,它在正文开头的“CREATE”一词上出错了。
  • 另外...我完全同意我的错误和问题与我对包体和规格没有清楚的了解有关!这个帖子对我帮助很大。
  • 上面提到的完整错误如下:Error(13,1): PLS-00103: Encountered the symbol "CREATE"
  • 我能够通过将其作为脚本运行而不是在包中进行编译来编译包。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2013-11-17
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多