Oracleエラー対応(ORA-04044):ORA-04044発生時の対処方法について

現役DBAが解説 ~Oracleエラー対応~

テーブル作成時に「ORA-04044:ここにはプロシージャ、ファンクション、パッケージ、型は指定できません」というエラーが発生することがあります。

本記事ではORA-04044の発生原因と対処方法を解説します。

1.エラーメッセージ

行3でエラーが発生しました。:
ORA-04044:
ここにはプロシージャ、ファンクション、パッケージ、型は指定できません。

本記事ではテーブル作成定義にシーケンスを誤った記述で指定させることで、ORA-04044を再現します。

2.エラー原因・対処方法

まず事前にCREATE TABLE文の中で、シーケンスの値を数値型項目のデフォルト値に設定し、正常終了することを確認します。

SQL> -- シーケンス作成
SQL> CREATE SEQUENCE tes_seq START WITH 10;

順序が作成されました。

SQL> -- テーブル作成 (シーケンスの値をデフォルト値に指定)
SQL> CREATE TABLE tes_tbl(
  2    no   NUMBER DEFAULT tes_seq.NEXTVAL,
  3    text CHAR(1)
  4  );

表が作成されました。

SQL>

上記をベースに意図的にORA-04044エラーを再現します。

ORA-04044エラーは、エラー本文にも記載がある通り、型の指定内容に誤りがあった際に発生します。
しかし、記載の内容によっては、ORA-04044以外のエラーも発生します。
実際にどのようなエラーが発生するのか、確認してみます。

1つ目は数値型項目に対して、デフォルト値の指定を文字型として実行した場合、エラーは「ORA-01722: 数値が無効です。」となります。

SQL> -- テーブル作成(シーケンス構文の誤り①)
SQL> CREATE TABLE tes_tbl(
  2    no   NUMBER DEFAULT 'tes_seq.NEXTVAL',
  3    text CHAR(1)
  4  );
  no   NUMBER DEFAULT 'tes_seq.NEXTVAL',
					  *
行2でエラーが発生しました。:
ORA-01722: 数値が無効です。

SQL>

2つ目はデフォルト値の指定「tes_seq.NEXTVAL」を誤った記載にした場合、エラーは「ORA-00904: “NEXTVAL”:無効な識別子です。」となります。

SQL> -- テーブル作成(シーケンス構文の誤り②)
SQL> CREATE TABLE tes_tbl(
  2    no   NUMBER DEFAULT NEXTVAL,
  3    text CHAR(1)
  4  );
  no   NUMBER DEFAULT NEXTVAL,
					  *
行2でエラーが発生しました。:
ORA-00904: "NEXTVAL": 無効な識別子です。

SQL>

3つ目はデフォルト値の指定「tes_seq.NEXTVAL」をさらに違った誤りの記載にすると、「ORA-00907: 右カッコがありません。」となり、別のエラーメッセージに変化します。

SQL> -- テーブル作成(シーケンス構文の誤り③) 
SQL> CREATE TABLE tes_tbl( 
  2    no   NUMBER DEFAULT NEXTVAL tes_seq,
  3    text CHAR(1)
  4  );
  no   NUMBER DEFAULT NEXTVAL tes_seq,
							  *
行2でエラーが発生しました。:
ORA-00907: 右カッコがありません。

SQL>

4つ目は先程の構文にかっこを付けた記載にすると、「ORA-04044:ここにはプロシージャ、ファンクション、パッケージ、型は指定できません。」と出力され、ようやくORA-04044を再現することができました。

QL> -- テーブル作成(シーケンス構文の誤り④)
SQL> CREATE TABLE tes_tbl( 
  2    no   NUMBER DEFAULT NEXTVAL (tes_seq),
  3    text CHAR(1)
  4  );
  no   NUMBER DEFAULT NEXTVAL (tes_seq),
					  *
行2でエラーが発生しました。:
ORA-04044:ここにはプロシージャ、ファンクション、パッケージ、型は指定できません。

SQL>

つまり、DEFAULT NEXTVALの後にかっこで指定する値に誤りがあった際にORA-04044エラーが出力されると想定されます。

想定が正しいかを確認するために、かっこに「1」と指定した場合にも確認してみましょう。
想定通りORA-04044が発生しました。

SQL> -- テーブル作成(シーケンス構文の誤り⑤)
SQL> CREATE TABLE tes_tbl(
  2    no   NUMBER DEFAULT NEXTVAL (1),
  3    text CHAR(1)
  4  );
  no   NUMBER DEFAULT NEXTVAL (1),
					  *
行2でエラーが発生しました。:
ORA-04044:
ここにはプロシージャ、ファンクション、パッケージ、型は指定できません。

SQL>

3.最後に

ORA-04044に関する解説は以上となります。

ORA-04044が発生する原因は指定内容の記載の誤りですが、内容によっては他のエラーが発生するため、本ブログを参考にしてください。