|
上贴链接:http://plat.delit.cn/forum.php?mod=viewthread&tid=834
如何检查一个错误的延迟事务到底作了什么?
有些时候因为种种原因,可能复制操作会出现错误。检查DEFERROR视图会发现有错误的延迟事务,我们首先可以通过DEFERRED_TRAN_ID和CALLNO在DEFCALL视图中查询这个操作大体上是在干什么。
select schemaname, packagename, procname from defcall;
其中SCHEMANAME表示哪个用户执行的DML,PACKAGENAME中可以知道是哪个对象上的操作,PROCNAME则可以知道是插入,更新还是删除。但是这样的信息往往不足够我们判断问题。我们想知道到底这个SQL干了什么,怎么办?我们可以利用DBMS_DEFER_QUERY.GET_CALL_ARGS来达到目的。运行以下的存储过程,可以得到想要查询的延迟事务的具体参数值。
CREATE OR REPLACE PROCEDURE GET_CALL(tran_id IN STRING,
callno IN NUMBER,
startarg IN NUMBER := 1,
argcnt IN NUMBER,
argsize IN NUMBER,
tran_db IN STRING := '') IS
v_types DBMS_DEFER_QUERY.TYPE_ARY;
v_vals DBMS_DEFER_QUERY.VAL_ARY;
indx NUMBER;
v_type_desc VARCHAR2(50);
BEGIN
DBMS_DEFER_QUERY.GET_CALL_ARGS(callno =>; callno,
startarg =>; startarg,
argcnt =>; argcnt,
argsize =>; argsize,
tran_db =>; tran_db,
tran_id =>; tran_id,
date_fmt =>; 'YYYY-MM-DD HH24:MI:SS',
types =>; v_types,
vals =>; v_vals);
FOR indx IN 1 .. argcnt LOOP
IF v_types(indx) = 1 THEN
v_type_desc := 'VARCHAR2';
END IF;
IF v_types(indx) = 2 THEN
v_type_desc := 'NUMBER';
END IF;
IF v_types(indx) = 12 THEN
v_type_desc := 'DATE';
END IF;
IF v_types(indx) = 23 THEN
v_type_desc := 'RAW';
END IF;
IF v_types(indx) = 96 THEN
v_type_desc := 'CHAR';
END IF;
IF v_types(indx) = 11 THEN
v_type_desc := 'ROWID';
END IF;
dbms_output.put_line('Arg ' || indx || ': Datatype ' ||
v_type_desc || '; Value: ' ||
v_vals(indx));
END LOOP;
END GET_CALL;
|
|