【问题标题】:How to find out exactly which column is causing error in a insert statement?如何在插入语句中准确找出导致错误的列?
【发布时间】:2022-01-03 14:08:20
【问题描述】:

有一个包含 100 列的插入语句。如果由于其中一列的长度小于插入的值而失败,那么我们只会收到类似

的错误

ORA-1234: Value larger than the precision

很难找出这 100 列中究竟是哪一列导致了这个错误。为什么 oracle 不能显示导致此失败的确切列名?

【问题讨论】:

  • 可以排除固定宽度或没有宽度的列。

标签: sql oracle plsql


【解决方案1】:

当列是 NUMBER 时,您可以:

  • 在将数据传递给INSERT 语句之前验证数据。
  • 忽略所有非数字列并对NUMBER 列进行二分搜索。
    • 删除INSERT 中的一半列/值,然后重试。
    • 如果成功,则您知道错误在另一半列/值中。
    • 如果失败,那么您知道这半列/值存在错误。
    • 重复删除连续的一半,直到将其缩小到单个列/值。

为什么 oracle 不能显示导致此失败的确切列名?

当列是 VARCHAR2 时,它会告诉您(您需要询问 Oracle 为什么他们不为数字列显示类似的消息)。

CREATE TABLE table_name (
  col1 VARCHAR2(1),
  col2 VARCHAR2(2),
  col3 VARCHAR2(3)
);

INSERT INTO table_name (col1, col2, col3)
VALUES ('a', 'bbb', 'ccc');

输出:

ORA-12899: value too large for column "FIDDLE_SWAFVOYHEGSLZFRFYJTK"."TABLE_NAME"."COL2" (actual: 3, maximum: 2)

并且,在 PL/SQL 中:

BEGIN
  INSERT INTO table_name (col1, col2, col3)
  VALUES ('a', 'bbb', 'ccc');
END;
/

输出:

ORA-12899: value too large for column "FIDDLE_OKWRWNCTGKRZMGUTOQIT"."TABLE_NAME"."COL2" (actual: 3, maximum: 2)
ORA-06512: at line 2

BEGIN
  INSERT INTO table_name (col1, col2, col3)
  VALUES ('a', 'bbb', 'ccc');
EXCEPTION
  WHEN others THEN                 -- Don't catch OTHERS in production code
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

输出:

ORA-12899: value too large for column "FIDDLE_ZOMSITCUWOHNDCJIRVGC"."TABLE_NAME"."COL2" (actual: 3, maximum: 2)

db小提琴here

【讨论】:

  • 它告诉VARCHAR列的情况,而不是当列是NUMBER时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多