ORA-1036の解決方法

Pro*Cで開発していて、ORA-1036のエラーが出た場合は以下が参考になるでしょう。(英語原文


問題の発生したSQLブロックはどうなっているでしょうか? WHENEVER句を含んでいますか? あるいはUSING句を使用していますか?
このエラーが発生する原因について、幾つかの理由が考えられます。

  1. 入出力用のホスト変数に同じものを使っていないかどうか確認してください。
  2. PREPARE句を使っているのであれば、エラーチェックを適切に行なっているか見直してください。
  3. Sun Solaris を使っていませんか? そうであれば、バグの可能性があります。
  4. メタリンクから:

問題点:
---------
ORA-1036エラー:「変数の<名前>/<数値>が無効です」は、Pro*Cアプリケーションで 埋め込みSQLを実行した時に発生します。このエラーメッセージは、必要なプリコンパイル・オプションが 設定されていないために起きますが、本来意味するエラーとかけ離れており誤解を招きやすいものです。

このエラーは、V1.x以前のバージョンのPro*Cで稼動しているデータベースからV2.x以上のPro*Cで 稼動しているデータベースにアプリケーションを移植するさいに起こる可能性があります。

解決策:
---------
この問題は、BUG #295686に関連しており、プリコンパイル・オプション「SQLCHECK」が原因で起こります。 バージョン1.xのPro*Cプリコンパイラでは、このオプションに"NONE"を設定していましたが、 バージョン2.x以上のPro*Cでは、"SYNTAX"を設定する必要があります。
これは新しいバージョンのプリコンパイラのアーキテクチャ/設計変更によるものです。

注:このオプションが正しく設定されていない場合(SQLCHECK=NONEになっている場合)でも、 実行可能なモジュールが生成され、SQLCA.SQLCODEを詳細にチェックしない限りきちんと動いているように 見えます。 しかし、SQLCODEの値をチェックすると、この非常に誤解を招きやすいORA-1036のエラーが発生しています。

5) 再度、メタリンクについて:

問題点の説明
===================
Pro*Cで埋め込みSQL文を実行した時に発生するORA-1036エラーについて

解決策の説明
====================
Pro*Cで埋め込みSQL文を実行した時に、ORA-1036「変数の<名前>/<数値>が無効です」 というエラーが発生した場合、プログラム中の変数とテーブルの列の型が一致しているかどうか 確認してください。

例)文字列に対するVARCHAR型とVARCHAR2型
数値列に対するLONG型とDOUBLE型
日付列に対するDATE型

また、テーブルの複数の列を連結してできている変数の場合には、型は同じでなければなりません。 文字型は、数値型や日付型とに分かれていてはなりません。文字型変数は、TO_CHAR()関数を 使用して数値型や日付型から文字型に変換する必要があります。


ORA-1036は、SQL文で使用されているバインド変数が一つでも見つからない場合に発生します。
理由は2つ考えられます。

1.変数名(列名ではない)でスペルミスをしている可能性があります。
2.変数が見つからない原因となるような、メモリリークが発生している可能性があります。

2番目の原因の場合、プリコンパイルされたプログラムであれば、&または&&を使っているSQL文、 または:変数(バインド変数)が書いてある個所全てでまったく異なる変数名(もちろん有効なもの)を使用すれば、 問題を解決することが出来ます。


2003/01/09 担当:数値DB再構築/新企業基本

[目次へ]