暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ORA-01438: 此列所允许的大于指定精度的值

ASKTOM 2020-06-13
1043

问题描述

亲爱的先生,

Interviwer询问我是否收到此错误ora-01438,即 “ORA-01438: 值大于此列所允许的指定精度”
然后,如果表具有150列并且所有列数据类型均为number,则如何找出不匹配的列大小。

请建议我。

谢谢 ....

专家解答

是的,这是一个有点讨厌的问题 :-) 因为众所周知,Oracle不会透露数字数据类型的列名。

我怀疑这个面试问题的目的是让您谈论如何解决这个问题…… 所以有些想法是:

1) 如果它是一个简单的文字语句,则可以使用DBMS_SQL获取错误的列

SQL> create table t
  2   ( x number(2),
  3     y number(3),
  4     z number(4)
  5   );

Table created.

SQL>
SQL> insert into t values (123,123,123);
insert into t values (123,123,123)
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column


SQL>
SQL> set serverout on
SQL> declare
  2    c   integer := dbms_sql.open_cursor ();
  3    erg integer;
  4    l_sql varchar2(4000) := 'insert into t values (123,123,123)';
  5  begin
  6    dbms_sql.parse (c, l_sql, dbms_sql.native);
  7    erg := dbms_sql.execute(c);
  8    dbms_sql.close_cursor (c);
  9  exception
 10    when others then
 11      dbms_output.put_line(sqlerrm);
 12      dbms_output.put_line(l_sql);
 13      dbms_output.put_line(lpad('^', dbms_sql.last_error_position+1,'='));
 14      dbms_sql.close_cursor (c);
 15  end;
 16  /
ORA-01438: value larger than specified precision allowed for this column
insert into t values (123,123,123)
======================^

PL/SQL procedure successfully completed.
复制


2) 在更现实的情况下,这些值是事先不知道的。为此,捕获绑定的SQL跟踪可以提供帮助,例如

exec dbms_monitor.session_trace_enable(binds=>true)
[run sql]
复制


跟踪文件包含每个绑定变量值,并且可以与每个列的数据类型大小进行比较



文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论