模式对象依赖
一些模式对象会引用其他对象,这样就会产生对象依赖。
例如:一个视图包含一个引用表或其他试图的查询,或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';
双引号里面的内容对大小写是敏感的。