В журналах ошибок Oracle Streams не отображаются значения отметок времени
При выводе журнала ошибок потоковой передачи в Oracle 10g в журнале не отображаются значения для полей меток времени; вместо этого он просто показывает "timestamp is SYS.TIMESTAMP" как старое и новое значение. Есть ли способ настроить потоки Oracle для отображения фактического значения метки времени? Нам нужна эта информация для правильной отладки основной причины этих ошибок потоковой передачи.
Например, выполнив следующее:
exec strmadmin.print_errors;
Дает нам этот (усеченный) журнал ошибок:
*************************************************
----- ERROR #1
----- Local Transaction ID: 10.31.14788721
----- Source Database: <REMOVED>
----Error Number: 1403
----Message Text: ORA-01403: no data found
--message: 1
type name: SYS.LCR$_ROW_RECORD
source database: <REMOVED>
owner: <REMOVED>
object: TPRODUCT
is tag null: Y
command_type: UPDATE
old(1): UIDPK
1001110
old(2): LAST_MODIFIED_DATE
typename is SYS.TIMESTAMP
2 ответа
Решение
На случай, если кому-то будет интересно, я нашел решение этой проблемы. Просто замените хранимую процедуру print_any следующей версией, которая выводит значение для типов данных timestamp:
CREATE OR REPLACE PROCEDURE print_any(data IN ANYDATA) IS
tn VARCHAR2(61);
str VARCHAR2(4000);
chr VARCHAR2(1000);
num NUMBER;
dat DATE;
rw RAW(4000);
res NUMBER;
BEGIN
IF data IS NULL THEN
DBMS_OUTPUT.PUT_LINE('NULL value');
RETURN;
END IF;
tn := data.GETTYPENAME();
IF tn = 'SYS.VARCHAR2' THEN
res := data.GETVARCHAR2(str);
DBMS_OUTPUT.PUT_LINE(SUBSTR(str,0,253));
ELSIF tn = 'SYS.CHAR' then
res := data.GETCHAR(chr);
DBMS_OUTPUT.PUT_LINE(SUBSTR(chr,0,253));
ELSIF tn = 'SYS.VARCHAR' THEN
res := data.GETVARCHAR(chr);
DBMS_OUTPUT.PUT_LINE(chr);
ELSIF tn = 'SYS.NUMBER' THEN
res := data.GETNUMBER(num);
DBMS_OUTPUT.PUT_LINE(num);
ELSIF tn = 'SYS.DATE' THEN
res := data.GETDATE(dat);
DBMS_OUTPUT.PUT_LINE(dat);
ELSIF tn = 'SYS.TIMESTAMP' THEN
res := data.GETTIMESTAMP(dat);
DBMS_OUTPUT.PUT_LINE(tn || ':' || to_char(dat,'DD-MON-YYYY HH24:MI:SS.FF'));
ELSIF tn = 'SYS.RAW' THEN
-- res := data.GETRAW(rw);
-- DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_LOB.SUBSTR(rw),0,253));
DBMS_OUTPUT.PUT_LINE(tn || ":RAW");
ELSIF tn = 'SYS.BLOB' THEN
DBMS_OUTPUT.PUT_LINE(tn || ":BLOB");
ELSE
DBMS_OUTPUT.PUT_LINE('typename is ' || tn);
END IF;
END print_any;
В сеансе, где запущена процедура print_any, используйте:
alter session set nls_date_format='HH24:Mi:SS MM/DD/YY';