【问题标题】:Can OCI_CONNECT cause a ORA-01438: value larger than specified precision allowed for this column?OCI_CONNECT 会导致 ORA-01438:值大于此列允许的指定精度吗?
【发布时间】:2011-11-16 05:49:34
【问题描述】:

我想知道 oci_connect() 是否会导致 1438 错误,因为我一直都这样:

警告:oci_connect() [function.oci-connect]:ORA-00604:错误 发生在递归 SQL 级别 1 ORA-01438:值大于 此列允许的指定精度 ORA-06512:在第 8 行 /xxxxxx/some.php 在第 220 行

这与查询的是哪个表无关。似乎 oci_connect() 正在某些 sys 表中插入一些跟踪人员,或者触发器与登录有关。但是我没有权限在 sys 中解决这个问题。

知道导致此错误的原因是什么?

更新

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

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

【问题讨论】:

    标签: php oracle ora-01438


    【解决方案1】:

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

    这是一个如何生成您遇到的错误的示例。我有一个名为 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 做任何开箱即用的日志记录,如果 PHP 的 oci_connect 也这样做,我会感到惊讶。

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

    【讨论】:

    • 听起来不错!我会尝试从管理员那里获取这些信息。
    【解决方案2】:

    好吧,根据列,您要么尝试插入一个大于 numeric 列允许范围的数字,要么尝试将字符串插入更长的 varchar2(n) 列比n 个字符。 Here 更详细地介绍了 Oracle 数据类型。

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

    【讨论】:

    • ORA-01438 仅发生在数字列中。如果您尝试为varchar2 列插入一个太大的值,它会给您ORA-12899: value too large for column
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多