1

Oracle 10gでストリーミングエラーのログを出力する場合、ログにはタイムスタンプフィールドの値は表示されません。代わりに、「timestampisSYS.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                                                                              
4

2 に答える 2

0

誰かが興味を持っている場合、私はこの問題の解決策を見つけました。「print_any」ストアドプロシージャを、タイムスタンプデータ型の値を出力する次のバージョンに置き換えるだけです。

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;
于 2011-02-10T21:18:31.603 に答える
0

print_anyプロシージャが起動されるセッションでは、次を使用します。

alter session set nls_date_format='HH24:Mi:SS MM/DD/YY';
于 2014-04-15T09:29:15.070 に答える