0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PL/SQL #2 簡単な関数

Last updated at Posted at 2024-05-07

※本記事は自学内容のアウトプットになります。

#関数

PL/SQLの特徴として、基本的な関数をSQL内で実行することができる点が挙げられる。

例えば
FOR文で一定の抽出処理をLOOPさせ、
抽出した内容をCSVなどに吐き出す際に
一行ずつ処理結果を吐き出す処理を作る場合

-- 宣言
DECLARE
-- 処理
BEGIN
  FOR i IN 1..10 LOOP
    IF (i IN (2, 4, 6, 8, 10)) THEN
      DBMS_OUTPUT.PUT_LINE(i || '偶数');
    ELSE
      DBMS_OUTPUT.PUT_LINE(i || '奇数');
    END IF;
  END LOOP;
END;

といった具合にLOOPさせることかできる。この内容を組み込むと、処理の流れは以下のようになる。

BEGIN

    --宣言部で抽出した結果を含むカーソル
    OPEN CUR1;
    --抽出件数を保存する宣言
  cnt = 0;
  
    -- 1件目
    FETCH CUR1 INTO CUR1_SP;

    /*
    上記処理とカウント関数を用いて
    ヘッダ行と明細行を使い分けることで
    cnt + 1 = 1 のときに
    ヘッダ行を出力
    それ以降は明細行として出力
    というような使い方も可能
    */

    --繰り返し処理
    LOOP

        -- カーソルにデータがない場合LOOPを終了
        IF CUR1%NOTFOUND THEN
            EXIT;
        END IF;

        --表領域の表示
        DBMS_OUTPUT.PUT_LINE(CUR1_SP.TABLESPACE_NAME);

        /*
        個人的によく使いのは別途ファイル出力用のファンクションを設け
        そこに ファンクション(カウント数, CUR1_SP)
        のような形で値を渡し、出力する方法
        */

        FETCH CUR1 INTO CUR1_BK;

    END LOOP;

    --カーソルのCLOSE
    CLOSE CUR1

上記の処理にCASE文などで条件分岐をさせ
より柔軟にデータを取得していくのが
一般的な業務上での使い方かと思う。

CASE WHEN '条件1'
       THEN 結果
     WHEN 条件2
       THEN 結果
     ELSE 結果
END

と、条件式を駆使し、
SQL内で柔軟な抽出処理に対応することができる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?