我创建了一个包,一切都很好。我认为这个包很好。
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。
答案 0 :(得分:3)
我需要写更多内容进行更新并选择。
这就是问题所在。该软件包期望规范中的所有过程也在体内;他们不是,所以有一个例外。
列出可以运行的例外:
SHOW ERRORS;
或者您可以使用:
SELECT * FROM USER_ERRORS;
所以对于你的代码:
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个程序,但正文中只有两个程序。
您需要定义modifyZadatak
和insertZadatak
程序。
编辑:在编辑原始问题之后,会出现问题。
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)