创建包体

时间:2018-06-14 11:37:56

标签: oracle plsql

我创建了一个包,一切都很好。我认为这个包很好。

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  /
  

警告:使用编译错误创建了Package Body。

4 个答案:

答案 0 :(得分:3)

  

我需要写更多内容进行更新并选择。

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

列出可以运行的例外:

SHOW ERRORS;

或者您可以使用:

SELECT * FROM USER_ERRORS;

所以对于你的代码:

SQL Fiddle

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

<强> Results

|       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语句。

答案 1 :(得分:0)

在不知道确切错误的地方,我可以从您发布的代码中推断出来。 您的规范中有4个程序,但正文中只有两个程序。 您需要定义modifyZadatakinsertZadatak程序。

编辑:在编辑原始问题之后,会出现问题。

displayZadatak过程需要4个参数,但在正文中只有3个参数。

在{{1}}过程中,Select需要在PLSQL中使用INTO进行分组以存储所选值。它可以是单个变量,行类型或集合。

答案 2 :(得分:0)

选择程序中只有一个小错误

 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  PROCEDURE deleteZadatak(
 18    p_id NUMBER)
 19  IS
 20  BEGIN
 21     DELETE FROM zadaci
 22     WHERE id = p_id;
 23   COMMIT;
 24  EXCEPTION
 25     WHEN OTHERS THEN
 26       ROLLBACK;
 27      RAISE;
 28  END;
 29  PROCEDURE modifyZadatak(
 30     p_id NUMBER,
 31     p_naziv VARCHAR2,
 32     p_kategorija VARCHAR2,
 33     p_opis VARCHAR2,
 34     p_komanda VARCHAR2)
 35  IS
 36  BEGIN
 37     UPDATE zadaci SET naziv = p_naziv, kategorija = p_kategorija, opis = p_opis,
 38     komanda = p_komanda WHERE id = p_id;
 39   COMMIT;
 40    EXCEPTION
 41    WHEN OTHERS THEN
 42       ROLLBACK;
 43       RAISE;
 44   END;
 45   PROCEDURE displayZadatak(p_id NUMBER,
 46   p_naziv VARCHAR2,
 47   p_kategorija VARCHAR2,
 48   p_opis VARCHAR2,
 49   p_komanda VARCHAR2)
 50   IS
 51   BEGIN
 52   SELECT naziv, kategorija, opis, komanda
 53  INTO p_naziv, p_kategorija, p_opis, p_komanda
 54  FROM zadaci WHERE id = p_id;
 55  COMMIT;
 56  EXCEPTION
 57  WHEN OTHERS THEN
 58     ROLLBACK;
 59     RAISE;
 60  END;
 61  END utl_zadaci;
 62  /

答案 3 :(得分:0)

  1. 无需过程即可创建包
  2. 创建包主体
  3. 将程序放在包上,然后放在包体中。