Oracle PLSQL - user000422/0 GitHub Wiki

拡張SQL。

DECLARE … 宣言部 変数などを定義 BEGIN~END … 処理部

SELECT INTO … SELECT結果を変数に代入(主にMAXやCOUNTで使う) 結果が0件、複数件の場合はエラー

-- SELECT INTO 基本型
DECLARE
 c_userId sample_table.userId%TYPE; -- 変数宣言(SELECT結果を代入)
BEGIN
  SELECT userId
  INTO c_userId -- 
  FROM sample_table;
END

CASE … 分岐 WHEN … 条件式、THEN … 処理文 単純CASE式では複雑な条件が指定できない IFより簡潔に記述できる ORDER BYに対しても使える

-- 単純CASE式 基本型
SELECT
  userId,
  CASE color -- 対象カラム
    WHEN 'red' THEN 'apple' -- 条件
    ELSE 'no fruits' -- 条件に一致しなかった場合
  END AS result -- 出力カラム(自身で定義)
FROM sample_table;

-- 検索CASE式 基本型
SELECT
  userId,
  CASE
    WHEN age < 19 THEN 'young' -- 条件
    ELSE 'old' -- 条件に一致しなかった場合
  END
FROM sample_table;

WHILE LOOP(応用)

DECLARE
  i NUMBER := 0;
  WHILE i < 10
  LOOP
    SELECT * INTO sample FROM sample_table; -- INTO句 必須
    i := i + 1;
  END LOOP
END

SQLをループ実行

実行後かならずジョブを削除すること。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'SAMPLE_JOB',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[
      BEGIN
        EXECUTE IMMEDIATE 'UPDATE sample_table SET sample_col = 100 WHERE test_col = 10';
      END;
    ]',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=10', -- 10秒ごとに
    enabled         => TRUE
  );
END;
/

JOB 運用

-- JOB 無効化
BEGIN
  DBMS_SCHEDULER.DISABLE('SAMPLE_JOB');
END;
/

-- JOB 削除
BEGIN
  DBMS_SCHEDULER.DROP_JOB('SAMPLE_JOB');
END;
/

-- JOB 確認
SELECT job_name, enabled, state FROM user_scheduler_jobs WHERE job_name = 'SAMPLE_JOB';