oracle - 创建包体
问题描述
我创建了一个包,一切正常。我觉得这个包做的很好。
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 /
警告:包体创建时出现编译错误。
解决方案
我需要为更新和选择写更多内容。
这就是问题所在。包期望规范中的所有过程也包含在主体中;他们不是,所以有一个例外。
要列出您可以运行的例外情况:
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
结果:
| 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
在调用过程的块中发出语句。
推荐阅读
- python - 为什么我得到错误的 IMAP 服务器?
- google-chrome - 编写 indexeddb 时的 chrome 行为。“数据可能已过时”
- php - 保留特定值并从数组php中删除其他值
- plot - XMGrace:如何在我的数据曲线旁边绘制带有标签的独立短线?
- ios - TabBarController 在调用 popToRootViewController() 后保留他的子控制器
- lua - CE Lua 中带有自定义进度条的倒数计时器
- c# - WCF方式与多个服务器通信客户端
- javascript - 附加 [i] 命名项目
- python - 如何将 valuesqueryset 转换为带有日期时间的 JSON?
- java - Javers 在比较 java.sql.Timestamp 和 java.util.Date 字段时显示差异,即使日期字段没有更改