1

oci_connect()が1438エラーを引き起こす可能性があるかどうか疑問に思っています。これは、常に発生するためです。

警告:oci_connect()[function.oci-connect]:ORA-00604:再帰SQLレベル1でエラーが発生しましたORA-01438:この列に許可されている指定された精度を超える値ORA-06512:/ xxxxxx/someの8行目。 220行目のphp

どのテーブルが照会されているかには依存しません。oci_connect()がsysテーブルにtrackingstaffを挿入しているか、トリガーがログオンに関連しているようです。しかし、私にはsysでこの問題を理解する権限がありません。

このエラーの原因は何でしょうか?

アップデート

オラクルは、特別に構成されていなくても、箱から出して自動的にどこかにロギングを実行しますか?どういうわけか、OracleまたはPHPに影響を受けるテーブルまたは列を表示させることはできますか?

更新 BashでPHPスクリプトを直接呼び出すと、正常に機能することがわかりました。しかし、Webからの呼び出しは、タイトル付きの問題を引き起こします。何か案が?

4

2 に答える 2

1

メッセージerror occurred at recursive SQL level 1は、エラーがトリガー内で発生していることを示しています。私の推測では、AFTER LOGON ON SCHEMAまたはDATABASEトリガーがあり、何らかの理由で、Webサーバープロセスが接続しようとしたときにエラーが発生します。

発生しているエラーを生成する方法の例を次に示します。TINY99までの値しか受け取れない単一の列を持つ、というテーブルがあります。

SQL> desc tiny;
 名前ヌル?タイプ
 -------------------------------------------------- ---------------------------
 N番号(2)

次に、ユーザーアカウントを作成して、接続できることを確認しましょう。

SQL>fredアカウントのロック解除によって識別されるユーザーfredを作成します。

ユーザーが作成しました。

SQL>fredへの接続を許可します。

グラントは成功しました。

SQL> fred/fredに接続
接続されています。

良い-私としてログインし直して、FRED接続しようとするとエラーが発生するトリガーを作成しましょう。

SQL>接続ルーク/パスワード
接続されています。
SQL>トリガーafter_logon_error_if_fredを作成または置換
  2データベースにログオンした後
  3開始
  4ユーザー='FRED'の場合
  5小さな(n)値(100)に挿入します。
  6終了する場合;
  7終了;
  8/

トリガーが作成されました。

TINYテーブルには99までの値しか格納できないことを思い出してください。では、FRED接続しようとするとどうなりますか?

SQL> fred/fredに接続
エラー:
ORA-00604:再帰SQLレベル1でエラーが発生しました
ORA-01438:この列に許可されている指定された精度よりも大きい値
ORA-06512:3行目

行番号とPHPが追加したビットを除けば、それはまさにあなたが受け取ったメッセージです。

AFTER LOGONデータベースにトリガーがあるかどうかを確認したい場合は、クエリを実行してみてください

SELECT trigger_name, owner FROM all_triggers
 WHERE TRIM(triggering_event) = 'LOGON';

私のデータベース(Oracle 11g XEベータ版)では、次の出力が得られます。

TRIGGER_NAME OWNER
------------------------------ -------------------- ----------
AFTER_LOGON_ERROR_IF_FRED LUKE

Oracleがすぐにログを作成できるとは思わないので、PHPがログを作成しているとしたら驚きoci_connectます。

エラーがWebサーバーでのみ発生し、bashスクリプトからPHPを実行した場合には発生しない理由についてのみ推測できます。おそらく、トリガーはクエリV$SESSIONを実行して、どのユーザーアカウントがデータベースに接続しようとしているのかを把握しようとしているのでしょうか。

于 2011-10-17T13:36:22.663 に答える
0

列に応じて、列の許容範囲よりも大きい数値を挿入しようとしているのか、文字よりも長いnumeric文字列を列に挿入しようとしているのかです。 Oracleデータ型の詳細は次のとおりですvarchar2(n)n

の220行目のどのテーブルのどの列に何が挿入されているかについてのより具体的な情報がなければsome.php、私はこれ以上直接的な助けにはなりません。

于 2011-09-13T14:34:59.473 に答える