首页 > 解决方案 > 创建包体

问题描述

我创建了一个包,一切正常。我觉得这个包做的很好。

SQL> CREATE OR REPLACE PACKAGE utl_zadaci AS
  2  PROCEDURE insertZadatak (
  3     p_naziv varchar2,
  4     p_kategorija varchar2,
  5     p_opis varchar2,
  6     p_komanda varchar2
  7  );
  8  
  9  PROCEDURE deleteZadatak (
 10         p_id number
 11    );
 12  
 13   PROCEDURE displayZadatak (
 14         p_id number,
 15     p_naziv varchar2,
 16         p_kategorija varchar2,
 17     p_opis varchar2,
 18     p_komanda varchar2
 19    );
 20  
 21  PROCEDURE modifyZadatak (
 22     p_id number,
 23     p_naziv varchar2,
 24     p_kategorija varchar2,
 25     p_opis varchar2,
 26     p_komanda varchar2
 27   );
 28  END utl_zadaci;
 29  /

 Package created.

当我创建包的主体时出现问题。

有一个我在这里找不到的错误

在这我是一个初学者,我第一次创建一个包。我需要为更新和选择写更多内容。

如果您知道,我也将非常感谢在这里为您提供帮助:D

SQL> CREATE OR REPLACE PACKAGE BODY utl_zadaci AS
 2  PROCEDURE insertZadatak(
 3  p_naziv VARCHAR2,
 4  p_kategorija VARCHAR2,
 5  p_opis VARCHAR2,
 6  p_komanda VARCHAR2)
 7  IS
 8  BEGIN
 9  INSERT INTO zadaci(id, naziv, kategorija, opis, komanda)
 10  VALUES(SEQ_ZADACI_ID.NEXTVAL, p_naziv, p_kategorija, p_opis, p_komanda);
 11  COMMIT;
 12  EXCEPTION
 13   WHEN OTHERS THEN
 14      ROLLBACK;
 15      RAISE;
 16  END;
 17  
 18  PROCEDURE deleteZadatak(
 19  p_id NUMBER)
 20  IS
 21  BEGIN
 22  DELETE FROM zadaci
 23  WHERE id = p_id;
 24  COMMIT;
 25  EXCEPTION
 26   WHEN OTHERS THEN
 27      ROLLBACK;
 28      RAISE;
 29  END;
 30  END utl_zadaci;
 31  /

警告:包体创建时出现编译错误。

标签: oracleplsql

解决方案


我需要为更新和选择写更多内容。

这就是问题所在。包期望规范中的所有过程也包含在主体中;他们不是,所以有一个例外。

要列出您可以运行的例外情况:

SHOW ERRORS;

或者您可以使用:

SELECT * FROM USER_ERRORS;

所以对于你的代码:

SQL小提琴

Oracle 11g R2 模式设置

CREATE TABLE zadaci(
  id VARCHAR2(20),
  naziv VARCHAR2(20),
  kategorija VARCHAR2(20),
  opis VARCHAR2(20),
  komanda VARCHAR2(20)
)
/
CREATE SEQUENCE SEQ_ZADACI_ID
/

/* Your code */

查询 1

SELECT * FROM USER_ERRORS

结果

|       NAME |         TYPE | SEQUENCE | LINE | POSITION |                                                                                                                            TEXT | ATTRIBUTE | MESSAGE_NUMBER |
|------------|--------------|----------|------|----------|---------------------------------------------------------------------------------------------------------------------------------|-----------|----------------|
| UTL_ZADACI | PACKAGE BODY |        1 |   11 |       13 | PLS-00323: subprogram or cursor 'DISPLAYZADATAK' is declared in a package specification and must be defined in the package body |     ERROR |            323 |
| UTL_ZADACI | PACKAGE BODY |        2 |   18 |       13 |  PLS-00323: subprogram or cursor 'MODIFYZADATAK' is declared in a package specification and must be defined in the package body |     ERROR |            323 |

顺便说一句 - 不要COMMIT在程序中使用。如果你这样做了,那么你不能在一个事务中使用多个过程,并且如果后面的过程引发错误,那么你就不能回滚整个事务,因为前面的过程已经被提交了。而是COMMIT在调用过程的块中发出语句。


推荐阅读