PL/SQL の基本的な書き方をまとめてみる

PL/SQL でよくある「SELECT した結果を1行ずつ操作する」という処理を雛形的に書いてみた。その他、よくあるイディオムをまとめてみた。

目次

基本形

Declare
  Cursor csr Is
    SELECT hoge FROM my_table;
  counter Number;
  csr_row csr%ROWTYPE;
Begin
  counter := 0;
  
  Open csr;
  Fetch csr Into csr_row;
  
  If csr_acc%NOTFOUND Then
    Close csr_acc;
    Raise NO_DATA_FOUND;
  End If;
  
  Loop
    Begin
      counter := counter + 1;
      Fetch csr Into csr_row;
      Exit When csr%NOTFOUND;
    End;
  End Loop;
  
  Close csr;
Exception
  When NO_DATA_FOUND Then
    Dbms_Output.Put_Line('カーソル0件のため処理中断・ロールバック');
    Rollback;
  When DUP_VAL_ON_INDEX Then
    Dbms_Output.Put_Line('一意制約違反・ロールバック');
    Rollback;
  When Others Then
    Dbms_Output.Put_Line('その他エラー・ロールバック');
    If csr%ISOPEN Then
      Close csr;
    End If;
    Rollback;
End;
/

ログを出力する

Set serverout on
Dbms_Output.Put_Line('ログ');

Echo 的な。ログとして出力するには Set serverout on が必要。

UPDATE 時の更新行数を知る

UPDATE my_table SET column = csr_row.column WHERE column = hoge;
update_counter := SQL%ROWCOUNT;

UPDATE 文の直後に SQL%ROWCOUNT を参照すると、そのクエリの更新行数が分かる。

暗黙的カーソル処理

For csr_row In csr Loop
  Begin
    処理
  End;
End Loop;