问题描述
亲爱的先生,
Interviwer询问我是否收到此错误ora-01438,即 “ORA-01438: 值大于此列所允许的指定精度”
然后,如果表具有150列并且所有列数据类型均为number,则如何找出不匹配的列大小。
请建议我。
谢谢 ....
Interviwer询问我是否收到此错误ora-01438,即 “ORA-01438: 值大于此列所允许的指定精度”
然后,如果表具有150列并且所有列数据类型均为number,则如何找出不匹配的列大小。
请建议我。
谢谢 ....
专家解答
是的,这是一个有点讨厌的问题 :-) 因为众所周知,Oracle不会透露数字数据类型的列名。
我怀疑这个面试问题的目的是让您谈论如何解决这个问题…… 所以有些想法是:
1) 如果它是一个简单的文字语句,则可以使用DBMS_SQL获取错误的列
2) 在更现实的情况下,这些值是事先不知道的。为此,捕获绑定的SQL跟踪可以提供帮助,例如
跟踪文件包含每个绑定变量值,并且可以与每个列的数据类型大小进行比较
我怀疑这个面试问题的目的是让您谈论如何解决这个问题…… 所以有些想法是:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。