【发布时间】:2014-08-22 08:02:29
【问题描述】:
我遇到了一个问题,即 Java 进程(我无法控制)将行插入表中并导致溢出。我无法拦截查询,并且 ORACLE 引发的异常没有提供信息。它只提到溢出,但没有提到它发生在哪一列。
我想知道导致此溢出的查询以及插入的值。
我尝试在表上创建一个触发器 BEFORE INSERT,将行复制到另一个我以后可以读取的临时表中,但是当溢出发生时,触发器似乎没有运行。
触发语法:
CREATE OR REPLACE TRIGGER OVERFLOW_TRIGGER
BEFORE INSERT
ON VICTIM_TABLE
FOR EACH ROW
BEGIN
insert into QUERIES_DUMP values (
:old.COL1, :old.COL2, :old.COL3,
:old.COL4, :old.COL5, :old.COL6,
:old.COL7, :old.COL8, :old.COL9,
:old.COL10, :old.COL11, :old.COL12
);
END;
/
QUERIES_DUMP 表具有与失败表相同的结构,但是 NUMBER 和 VARCHAR2 列被推到了最大容量。我希望得到一个查询列表,然后找出哪些违反了规则。
如果设置为在插入之前运行,是否期望触发器在溢出时不运行?
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
EDIT1:
抛出的错误是:
Description: Error while query: INSERT INTO
...
ORA-01438: value larger than specified precision allowed for this column
我所知道的是,在任何地方都没有插入错误的类型。这很可能是其中一个数字字段的长度,但它们数量众多,插入过程需要一个多小时,所以我无法强行猜测该列。
我考虑过备份表并创建一个具有更大列的新受害者表,但该过程实际上插入到许多其他表以及复杂数据模型中,并且数据库具有一些敏感信息,所以我不能移动东西会危及它的一致性。
我尝试了 INSTEAD OF 触发器,但 ORACLE 似乎不接受 INSTEAD OF 用于表上的插入。
我在 JDBC 层添加了日志记录,但我得到的查询没有值,只有“?”
Description: Error while query: INSERT INTO VICTIM_TABLE ( . . . ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
【问题讨论】:
-
您需要在autonomous transaction 中插入。它正在回滚。
-
开启追踪,然后运行 TKPROF。