今週の勉強内容

引き続きPL/SQLの勉強。

例外処理

DECLARE
  e_empno NUMBER;
BEGIN
  SELECT empno INTO e_empno FROM emp;
EXCEPTION
  WHEN too_many_rows THEN
    DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
  WHEN no_data_found THEN
    DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
END;
/
  • 例外の種類
    • 内部例外: Oracleで事前定義
      • 事前定義の内部例外: Oracleが名前をつけてる
      • 無名の内部例外: 名前がつけられていない
    • ユーザー例外: ユーザーが定義(ORA-XXXエラー)
  • ユーザー定義例外 RAISEで発生
  • ユーザー定義のエラーメッセージ RAISE_APPLICATION_ERRORで指定
  • OTHERハンドラ 例外名が指定されていない全ての例外を処理
    = 必ず正常終了
    *例外を全てキャッチするため、例外処理部の最後に記述
  • エラー報告関数 OTHERハンドラの内容を調査・報告する関数
    • SQLCODE: エラー番号
    • SQLERRM: エラーメッセージ
  • 例外処理とブロックのネスト ブロックのネストを使用すると、カーソル処理の途中で 例外発生しても残りの結果セットを処理できる
DECLARE
  err EXCEPTION;
  CURSOR dept_cur IS SELECT deptno FROM dept;
BEGIN
  FOR r IN dept_cur LOOP
    BEGIN
      IF r.deptno = 30 THEN
        RAISE err;
      ELSE
        DBMS_OUTPUT.PUT_LINE(r.deptno);
      END IF
    EXCEPTION
      WHEN err THEN
        DBMS_OUTPUT.PUT_LINE('例外が発生');
    END;
  END LOOP;
END;
/

ストアド・サブプログラム概要

  • ストアド・サブプログラム プログラムに名前をつけ、Oracleに格納して実行
  • 利点
    • 共有利用による生産性工場
    • パフォーマンスの工場
    • メモリ領域の節約
    • ネットワーク送信量の現象
  • 2種類の分類
    • ストアド・プロシージャ
    • ストアド・ファンクション
  • ストアド・サブプログラムの共有化
    • 実行権限(EXECUTE)の付与が必要 直接操作させず、プロシージャを通しての操作のみ許可
  • ストアド・サブプログラムの登録と参照 データディクショナリにプログラム名・作成者・ソースコードなどが登録される
    USER_SOURCEビューで参照可能
    ユーザーが所有するストアド・オブジェクトのソースコードを表示
  • ストアド・サブプログラムのデバッグ
    • エラー内容の特定
      • SHOW ERRORSコマンド: SQL *Plusでコマンド入力
      • USER_ERRORSビューの参照
      • DBMS_OUTPUTを記述: EXECUTE XXXで実行