【发布时间】:2022-01-03 14:08:20
【问题描述】:
有一个包含 100 列的插入语句。如果由于其中一列的长度小于插入的值而失败,那么我们只会收到类似
的错误ORA-1234: Value larger than the precision
很难找出这 100 列中究竟是哪一列导致了这个错误。为什么 oracle 不能显示导致此失败的确切列名?
【问题讨论】:
-
可以排除固定宽度或没有宽度的列。
有一个包含 100 列的插入语句。如果由于其中一列的长度小于插入的值而失败,那么我们只会收到类似
的错误ORA-1234: Value larger than the precision
很难找出这 100 列中究竟是哪一列导致了这个错误。为什么 oracle 不能显示导致此失败的确切列名?
【问题讨论】:
当列是 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
【讨论】: