Oracleトリガーが「コンパイルエラー」で作成された理由とは?

SQL

~ORA-00920とSHOW ERRORSから学ぶ構文ミスの見抜き方~

Oracleのトリガーは非常に強力な仕組みですが、構文ミスがあっても「作成されてしまう」ため、油断すると動かないトリガーが放置されることになりがちです。

この記事では、実際に遭遇したトリガーのコンパイルエラー(ORA-00920)の原因と、正しい書き方への修正方法を詳しく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


🧪実行したトリガー(失敗例)

以下は、emp テーブルの操作を監査テーブル emp_audit に記録しようとしたトリガーの作成例です。

CREATE OR REPLACE TRIGGER trg_emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
BEGIN
INSERT INTO emp_audit
VALUES (
USER,
CASE
WHEN INSERTING THEN 'INSERT'
WHEN UPDATING THEN 'UPDATE'
WHEN DELETING THEN 'DELETE'
END,
CASE
WHEN DELETING THEN :OLD.empno
ELSE :NEW.empno
END,
SYSDATE
);
END;
/

❗実行結果(実機検証)

警告: トリガーが作成されましたが、コンパイル・エラーがあります。  ★

SQL> SHOW ERRORS TRIGGER trg_emp_audit
TRIGGER TRG_EMP_AUDITのエラーです。

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/3 PL/SQL: SQL Statement ignored
6/22 PL/SQL: ORA-00920: 関係演算子が無効です。

❓ORA-00920 の原因:CASE式の誤用

ORA-00920: 関係演算子が無効です。 は通常、SQL構文の中で不正な比較や式の使い方をしたときに出るエラーです。

今回の原因は:

PL/SQLの CASE 式に対して、WHEN INSERTING THEN のような
論理値(BOOLEAN)を使ってしまった


🔍なぜ WHEN INSERTING THEN ... が使えないのか?

  • Oracleの CASE 式は、次のようにスカラ値(数値や文字列)を扱うための構文です: sqlコピーする編集するCASE col WHEN 'A' THEN ... WHEN 'B' THEN ... END
  • INSERTINGDELETINGBOOLEAN型(真偽値)であり、
    CASE 式で比較対象として使うことは構文的に許可されていません

✅正しい書き方(IF文+変数使用)

トリガー本体で IF INSERTING THEN ... のように明示的に条件分岐して処理するように書き換えましょう。

CREATE OR REPLACE TRIGGER trg_emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
v_action VARCHAR2(10);
v_empno NUMBER;
BEGIN
IF INSERTING THEN
v_action := 'INSERT';
v_empno := :NEW.empno;
ELSIF UPDATING THEN
v_action := 'UPDATE';
v_empno := :NEW.empno;
ELSIF DELETING THEN
v_action := 'DELETE';
v_empno := :OLD.empno;
END IF;

INSERT INTO emp_audit
VALUES (
USER,
v_action,
v_empno,
SYSDATE
);
END;
/

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


🛠SHOW ERRORS の使い方(おさらい)

トリガー、プロシージャ、関数などでコンパイルエラーが発生した場合は、必ず以下のコマンドでエラー内容を確認しましょう。

SHOW ERRORS TRIGGER trg_emp_audit

出力される形式:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/3 PL/SQL: SQL Statement ignored
6/22 PL/SQL: ORA-00920: 関係演算子が無効です。

✅ エラーがなければ出力されません(=正常コンパイル済み)


📝まとめ

トピック内容
原因CASE 式で INSERTING/DELETING を使っていた
症状ORA-00920: 関係演算子が無効です。
対処法IF INSERTING THEN ... 形式に書き直す
検証方法SHOW ERRORS TRIGGER <名前> でエラー確認


[参考]
14.12 CREATE TRIGGER文

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました