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 表中插入一些跟踪人员,或者触发器与登录有关。但我无权在 sys.xml 中找出这个问题。

任何想法可能是导致此错误的原因?

更新

oracle 是否会在没有专门配置的情况下自动在某处进行日志记录?我可以让 oracle 或 PHP 告诉我哪个表或列受到影响吗?

更新 我发现,当我直接在 Bash 中调用 PHP 脚本时,它确实可以正常工作。但是来自网络的电话会导致标题问题。任何想法?

4

2 回答 2

1

该消息error occurred at recursive SQL level 1向我表明错误是在触发器中出现的。我的猜测是有一个AFTER LOGON ON SCHEMADATABASE触发器,并且由于某种原因,当您的 Web 服务器进程尝试连接时它会导致错误。

这是一个如何生成您遇到的错误的示例。我有一个名为 的表TINY,其中有一列最多只能取 99 的值:

SQL> 描述小;
 名称空?类型
 ----------------------------------------- -------- - --------------------------
 N 号码(2)

现在让我们创建一个用户帐户并验证他们是否可以连接:

SQL>创建由fred账号解锁标识的用户fred;

用户创建。

SQL> 授予连接到弗雷德;

格兰特成功了。

SQL> 连接弗雷德/弗雷德
连接的。

FRED好 - 让我们以我的身份重新登录并创建一个触发器,如果​​尝试连接会导致错误:

SQL> 连接卢克/密码
连接的。
SQL> 创建或替换触发器 after_logon_error_if_fred
  2 登录数据库后
  3 开始
  4 如果用户 = 'FRED' 那么
  5 插入微小 (n) 值 (100);
  6 结束如果;
  7 结束;
  8 /

触发器已创建。

回想一下,我们的TINY表最多只能存储 99 个值。那么,当FRED尝试连接时会发生什么?

SQL> 连接弗雷德/弗雷德
错误:
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 beta)上,我得到以下输出:

TRIGGER_NAME 所有者
------------------------------ -------------------- ----------
AFTER_LOGON_ERROR_IF_FRED LUKE

我不相信 Oracle 做任何开箱即用的日志记录,如果 PHPoci_connect做任何事情我都会感到惊讶。

我只能推测为什么错误只出现在您的 Web 服务器上,而不是当您从 bash 脚本运行 PHP 时出现。也许触发器正在查询V$SESSION并试图找出正在尝试连接到数据库的用户帐户?

于 2011-10-17T13:36:22.663 回答
0

好吧,根据列,您要么尝试插入大于列允许范围的数字,要么尝试numeric将字符串插入varchar2(n)n字符长的列中。 以下是有关 Oracle 数据类型的更多细节。

如果没有关于在第 220 行的哪个表的哪个列中插入什么的更具体信息some.php,我无法提供更直接的帮助。

于 2011-09-13T14:34:59.473 回答