2017-08-07 6 views
0

ORACLEストアドプロシージャとファンクションに関する1つの質問
テーブルに新しい列を追加しました。この表には、新しい列を使用せずに多くのストアド・プロシージャおよびファンクションが関係しています。私はテーブルを使用している関数とプロシージャを再コンパイルする必要があります、新しい列がそれらのSPと関数のクエリに関与していない場合でもですか?また、統計などを更新する必要がありますか?テーブルに新しい列が追加された場合は、すべてのSP関数を再コンパイルする必要があります

私は理論的な質問をしていますが、とにかく分かります。 お知らせください。

おかげ

+0

Sybase製品(ASE、SQLAnywhere、IQ、Advantage)はどちらですか?なぜあなたの質問に 'oracle'でタグを付けましたか? – markp

答えて

0

1-ソースオブジェクトが変更された場合、それらの依存ストアド・プロシージャおよび関数を再びコンパイルしなければなりません。

2-どのspまたは関数がテーブルに依存しているかを知りたければ、次のようなものを試すことができます。

select * from USER_SOURCE where text like '%your_table_name%'; 
select * from DBA_SOURCE where text like '%your_table_name%'; 
select * from ALL_SOURCE where text like '%your_table_name%'; 

3-統計情報を収集してはいけませんが、パフォーマンスのために集計と更新のヒストグラムが役立ちます。

+0

Byは、そのテーブルの新しい列を使用するか、またはnew以外の他の列と一緒にテーブル名を使用するということに依存しますか? – SamOl

+0

新しいものを除いて、他の列でテーブル名を使用するだけですか? –

0

変更内容によって異なります。あなたは何かが何らかの理由で無効にされているかどうかを確認するために影響を受ける可能性があるかを確認するthe all_dependencies view (or the user_ or dba_ equivalents)を見て、そしてthe user_objects viewことができます。

create table t42 (col1 varchar2(10)); 
insert into t42 (col1) values ('val1'); 

create procedure p42 as 
    l_col1 t42.col1%type; 
begin 
    select col1 into l_col1 from t42; 
    dbms_output.put_line(l_col1); 
end p42; 
/

column object_name format a12 

select object_type, object_name, status 
from user_objects 
where object_name in ('T42', 'P42'); 

OBJECT_TYPE   OBJECT_NAME STATUS 
------------------- ------------ ------- 
PROCEDURE   P42   VALID 
TABLE    T42   VALID 

select type, name, dependency_type 
from user_dependencies 
where referenced_type = 'TABLE' and referenced_name = 'T42'; 

TYPE    NAME       DEPE 
------------------ ------------------------------ ---- 
PROCEDURE   P42       HARD 

は、列、この場合の手順が無効になるわけではないの追加:

alter table t42 add (col2 varchar2(10)); 

select object_type, object_name, status 
from user_objects 
where object_name in ('T42', 'P42'); 

OBJECT_TYPE   OBJECT_NAME STATUS 
------------------- ------------ ------- 
PROCEDURE   P42   VALID 
TABLE    T42   VALID 

手順で使用される列を変更するけれども行います

alter table t42 modify (col1 varchar2(20)); 

select object_type, object_name, status 
from user_objects 
where object_name in ('T42', 'P42'); 

OBJECT_TYPE   OBJECT_NAME STATUS 
------------------- ------------ ------- 
PROCEDURE   P42   INVALID 
TABLE    T42   VALID 

しかし、あなたは明示的に手順を再コンパイルする必要はありません。あなたは、あなたがしたいことができれば、それが参照されるときに、Oracleは自動的に無効なオブジェクトを再コンパイルしようとします:あなたは、あまりにも依存関係の詳細情報や詳細情報を取得するためにPL/Scopeを使用することができます

exec p42; 

PL/SQL procedure successfully completed. 

select object_type, object_name, status 
from user_objects 
where object_name in ('T42', 'P42'); 

OBJECT_TYPE   OBJECT_NAME STATUS 
------------------- ------------ ------- 
PROCEDURE   P42   VALID 
TABLE    T42   VALID 

関連する問題