用DBMS_DDL包重編譯PL/SQL對象
2024-07-21 02:08:42
供稿:網友
網站運營seo文章大全提供全面的站長運營經驗及seo技術!
用dbms_ddl包重編譯pl/sql對象
本篇文章,我們將會看到怎樣用dbms_ddl包中的alter_compile過程重新編譯已存儲在數據庫的對象.
alter_compile過程
這個過程等價于如下語句
alter procedure|function|package [<schema>.] <name> compile [body]
語法
dbms_ddl.alter_compile (
type varchar2,
schema varchar2,
name varchar2);
參數:
type
數據庫對象的類型.正確值如下:
procedure –重編譯指定的過程
function –重編譯指定的函數
package -重編譯指定的包頭和包體
package_body -重編譯指定的包體
trigger -重編譯指定的觸發器
schema
重編譯對象的方案名稱,若為null,則為當前方案名稱(大小寫敏感)
name
重編譯對象的名稱(大小寫敏感)
現在,如果想重編譯一個程序,oracle首先會重編譯被標識invalid的程序所依賴的所有對象.
例1:
編譯myuser方案的access_rights過程:
dbms_ddl.alter_compile('procedure','myuser','access_rights');
例2:
差不多每個實例中,pl/sql對象名稱以大寫方式存儲,如果創建時指定一個雙引號的對象名稱,那么當編譯時應指定同樣的方式.
如果指定不正確,則會報以下的錯誤
sql> dbms_ddl.alter_compile('procedure','myuser','access_rights');
begin dbms_ddl.alter_compile('procedure','myuser','access_rights'); end;
*
error at line 1:
ora-20000: unable to compile procedure "myuser"."access_rights",
insufficient privileges or does not exist
ora-06512: at "sys.dbms_ddl", line 68
ora-06512: at line 1
因此如果你創建如下的對象:
create or replace procedure "my_object" is
begin
...
得使用:
dbms_ddl.alter_compile('procedure','myuser','my_object');
也可以使用alter procedure <procedure name> compile命令來編譯對象,用dbms_ddl包最大的優勢在于可以在以后的程序或pl/sql中編譯,這將擁有完全的靈活性以創建強有力的使用價值(請參照如下例子)
例3:
這個例子將獲得所有無效的對象并且重新編譯
set termout on
set serverout on
declare
cursor cur_invalid_objects is
select object_name, object_type from user_objects where status='invalid';
rec_columns cur_invalid_objects%rowtype;
err_status numeric;
begin
dbms_output.enable(10000);
open cur_invalid_objects;
loop
fetch cur_invalid_objects into rec_columns;
exit when cur_invalid_objects%notfound;
dbms_output.put_line
('recompiling ' || rec_columns.object_type || ' ' || rec_columns.object_name);
dbms_ddl.alter_compile(rec_columns.object_type,null,rec_columns.object_name);
end loop;
close cur_invalid_objects;
exception
when others then
begin
err_status := sqlcode;
dbms_output.put_line(' recompilation failed : ' || sqlerrm(err_status));
if ( cur_invalid_objects%isopen) then
close cur_invalid_objects;
end if;
exception when others then
null;
end;
end;
/
總結:
alter_compile可以代替手工而自動編譯對象,查找那些無效的對象從而一個一個地編譯.