模式对象依赖

一些模式对象会引用其他对象,这样就会产生对象依赖。

例如:一个视图包含一个引用表或其他试图的查询,或PL/SQL子程序调用其他子程序。

如果对象A的定义引用了对象B,那么,A就是依赖对象,B则是被引用对象。

还有注意:oracle数据库提供了一种自动机制,以确保依赖对象对于相应的被引用对象来说始终都是最新的。

当被引用对象的更改可能会影响依赖对象时,依赖对象被标记为无效。。。

在一个无效的依赖对象重新变得可用之前,必须基于对被引用对象的新定义重新编译。

当无效依赖对象被引用时,重新编译会自动发生。

create table monkeys(col1 varchar(32),col2 integer);

create or repalce procedure test_proc

as

begin

 for x in(select col1,col2 from monkeys)

 loop

  null;

end loop;

end;

/

下面的是查询显示存储过程的状态是否有效;

select object_name,status from user_objects where objec_name=‘TEST_PROC’;

OBJECT_NAME   STATUS
--------------------------------
TEST_PROC       VALID

注意:

1:

in 里面就是一个结果集,x相当于指针,这个叫做隐式游标。

loop里面一般是插入记录,或者更新,或者输出查询记录,是用户自己添加各种功能,看自己的需要。

2:

for ... loop

end loop;

是一个整体,循环结构,叫做for循环,

3:

select object_name,status from user_objects where objec_name=‘TEST_PROC’;''号里面

的要写成大写,Oracle把所有的模式对象的名称都存储为大写, 这个是Oracle的默认行为,记住就好了。

至于Oracle为什么要这么做,是为了减少数据库用户出错的几率。比如,如果区分大小写,那么我建一个

表叫做Proc_Test,你建一个叫做PROC_TEST,他建一个叫做Proc_test,这样会引起混论的,出错的概率就高了

统一大小写,就没有这个问题了。当然代价是性能上会有一点点损失,数据库里面存储的是全部大写,你写的时

候不是全部大写,代价就是这个转换过程。

4:

CREATE OR REPLACE PROCEDURE "Test_Proc"
AS
BEGIN
FOR x IN ( SELECT col1, col2 FROM test_table )
LOOP
-- process data
NULL;
END LOOP;
END;
/

这时候就要写成下面这样:
select object_name,status from user_objects where object_name='Test_Proc';

双引号里面的内容对大小写是敏感的。

 

posted @ 2013-05-18 23:26  蒋奥  阅读(543)  评论(0编辑  收藏  举报