1. ホーム
  2. SQL

plsql-stored-procedure ORA-06550 エラー処理

2022-02-13 15:55:46
先日、ストアドプロシージャを書いたところ、以下のようなエラーが発生しました。
ORA-06550: 1 行目、7 列目: PLS-00905: オブジェクト SZXFJF.update_flag は無効です。 
ORA-06550: 1 行目、7 列目: PL/SQL: ステートメントが無視されました
プロシージャの作成または置換 update_flag
(date_f in dz_resultfromboss_dz_tmp.SCPDATEANDTIME%type.DATE_f in dz_resultfromboss_dz_tmp.SCPDATEANDTIME%type, --Error 1, このテーブルはライブラリに存在しません。
 date_l in dz_resultfromboss_dz_tmp.SCPDATEANDTIME%type)
は 
始める 
drop table dz_resultfromboss_dz_tmp; --エラー2、SQL文の実行時にはexecute immediateを使用する必要があります。 ' drop table dz_resultfromboss_dz_tmp ';
dbms_output.put_line('table dropped!!!') ;
テーブルdz_resultfromboss_dz_tmpを作成します。 
as select substr(SEQUENCE,5,28) "SEQUENCE" ,
CHECKRESULTFLAG dz_resultfromboss_dz dz1より 
ここで dz1.innetcode=006               
およびdz1.SCPDATEANDTIME>=date_f   
とdz1.SCPDATEANDTIME<date_l.を比較します。
dbms_output.put_line('table created!!!') ;
dz_resultfromboss_dz_tmp_idx on dz_resultfromboss_dz_tmp(SEQUENCE) を作成します。
dbms_output.put_line('index created!!!') ;
update sj_fileprocresult_0803 sj 
set sj.dzstatus = (SELECT dz1.Checkresultflag) 
dz_resultfromboss_dz_tmp dz1より 
ここで、sj.sequence=dz1.sequence) ;   
コミットします。           
dbms_output.put_line('table updated!!!') ;  
update_flagを終了します。
上記のストアドプロシージャを以下のように変更します。
<スパン
プロシージャの作成または置換 update_flag
(date_f in dz_resultfromboss_dz.SCPDATEANDTIME%type, date_l in dz_resultfromboss_dz.SCPDATEANDTIME%type)
は 
始める 
immediate 'drop table dz_resultfromboss_dz_tmp' を実行します。
dbms_output.put_line('table dropped!!!') ;
即座に実行   'create table dz_resultfromboss_dz_tmp 
as select substr(SEQUENCE,5,28) "SEQUENCE" ,
CHECKRESULTFLAG dz_resultfromboss_dz dz1より 
ここで dz1.innetcode=006               
およびdz1.SCPDATEANDTIME>=date_f   
とdz1.SCPDATEANDTIME<date_l' があります。
dbms_output.put_line('table created!!!') ;
即座に実行 'create index dz_resultfromboss_dz_tmp_idx on dz_resultfromboss_dz_tmp(SEQUENCE)' とします。
dbms_output.put_line('index created!!!') ;
即座に実行 'update sj_fileprocresult_0803 sj 
set sj.dzstatus = (SELECT dz1.Checkresultflag) 
dz_resultfromboss_dz_tmp dz1より 
where sj.sequence=dz1.sequence)' ;   
コミットします。           
dbms_output.put_line('table updated!!!') ;  
update_flagを終了します。
概要
1. このエラーは一般的に書き込みエラーです。
2. ライブラリテーブルの有効性チェックに注意を払う
3、ddlステートメントの最後の使用 即時実行