包中添加新过程应在尾部添加[转帖]_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3665 | 回复: 0   主题: 包中添加新过程应在尾部添加[转帖]        下一篇 
wayne
注册用户
等级:中校
经验:1690
发帖:221
精华:0
注册:2011-7-21
状态:离线
发送短消息息给wayne 加好友    发送短消息息给wayne 发消息
发表于: IP:您无权察看 2011-9-15 9:43:27 | [全部帖] [楼主帖] 楼主

在看高级应用开发手册时,在对象依赖部分,注意到这个细节。

其他对象依赖包中的过程或函数,如果这个过程或函数在包中的位置发生了变化,那么依赖当前过程或函数的对象会被置为INVALID状态。

SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 PROCEDURE P1;
3 FUNCTION F1 RETURN NUMBER;
4 END;
5 /
Package created.
SQL> CREATE OR REPLACE FUNCTION F2 RETURN NUMBER AS
2 BEGIN
3 RETURN P_TEST.F1;
4 END;
5 /
Function created.
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'F2');
OBJECT_NAME STATUS
------------------------------ -------
F2 VALID
P_TEST VALID
SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 PROCEDURE P1;
3 FUNCTION F1 RETURN NUMBER;
4 PROCEDURE P3;
5 END;
6 /
Package created.
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'F2');
OBJECT_NAME STATUS
------------------------------ -------
F2 VALID
P_TEST VALID
SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 PROCEDURE P1;
3 PROCEDURE P2;
4 FUNCTION F1 RETURN NUMBER;
5 PROCEDURE P3;
6 END;
7 /
Package created.
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'F2');
OBJECT_NAME STATUS
------------------------------ -------
F2 INVALID
P_TEST VALID


如果将新增过程置于包的尾部,则不会影响依赖关系。而如果将新增过程置于某些已有过程或函数的前面,则所有依赖这些过程或函数的对象将被置于INVALID状态,这是由于依赖关系和过程或函数在包中的位置有关。

不过这种位置只是过程或函数的排序,和具体所在行数无关,而且只和过程或函数有关,如果新增变量则不会产生影响:

SQL> ALTER FUNCTION F2 COMPILE;
Function altered.
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'F2');
OBJECT_NAME STATUS
------------------------------ -------
F2 VALID
P_TEST VALID
SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 G_NUM NUMBER;
3 PROCEDURE P1;
4 PROCEDURE P2;
5 FUNCTION F1 RETURN NUMBER;
6 PROCEDURE P3;
7 END;
8 /
Package created.
SQL> SELECT OBJECT_NAME, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME IN ('P_TEST', 'F2');
OBJECT_NAME STATUS
------------------------------ -------
F2 VALID
P_TEST VALID




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论