~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 INSERTINGやDELETINGはBOOLEAN型(真偽値)であり、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 <名前> でエラー確認 |




コメント