2012-03-26 81 views
1

我正在使用Oracle/MyBatis並嘗試使用大量參數調試存儲過程。在存儲過程中,我得到一個ORA-01438: value larger than specified precision allowed for this columnMyBatis和DBMS_OUTPUT

所以我最初的做法是像存儲過程中的dbms_output.put_line一樣嘗試查看哪些值正好在冒犯性語句之前。如果沒有MyBatis,我通常會打開一個sqlplus腳本並輸入set serveroutput on,然後稍後運行我的存儲過程以查看所有調試消息。使用MyBatis,我無法弄清楚如何(如果可能)獲得這些調試語句。

我有ibatis和sql調試器設置爲DEBUG,我使用log4j來記錄我的Tomcat 6應用程序的所有內容。

回答

3

DBMS_OUTPUT軟件包還有其他一些可以使用的程序。 DBMS_OUTPUT.ENABLE的功能非常類似於SQL * Plus命令set serveroutput on,因爲它爲DBMS_OUTPUT.PUT_LINE分配了要寫入的緩衝區。 DBMS_OUTPUT.GET_LINE可用於通過先前調用DBMS_OUTPUT.PUT_LINE來獲取寫入該緩衝區的數據。所以應該可以調用ENABLE函數,調用向緩衝區寫入若干行的過程,然後調用GET_LINE(或GET_LINES)來獲取寫入DBMS_OUTPUT緩衝區的數據,並將該數據寫入日誌。

但是,將日誌記錄重定向到Oracle數據庫表可能會更簡單,而不是嘗試使用DBMS_OUTPUT。一種常用的方法是創建您自己的包,該包有一個開關來決定是寫入DBMS_OUTPUT還是寫入表中。像

CREATE OR REPLACE PACKAGE p 
AS 
    procedure l(p_str IN VARCHAR2); 
END; 

CREATE OR REPLACE PACKAGE BODY p 
AS 
    g_destination INTEGER; 
    g_destination_table CONSTANT INTEGER := 1; 
    g_destination_dbms_out CONSTANT INTEGER := 2; 

    PROCEDURE l(p_str IN VARCHAR2) 
    AS 
    BEGIN 
    IF(g_destination = g_destination_dbms_out) 
    THEN 
     dbms_output.put_line(p_str); 
    ELSE 
     INSERT INTO log_table ... 
    END IF; 
    END; 

    BEGIN 
    g_destination := <<determine which constant to set it to. This 
         may involve querying a `SETTINGS` table, looking 
         at the environment, or something else>> 
    END; 
END; 
+0

是的我想我真的必須去你提到的第二種方法,開關。可能不值得擔心如何獲取Tomcat日誌。 – demongolem 2012-03-26 22:27:32

+0

爲了記錄,[這裏是如何從JDBC獲取'DBMS_OUTPUT.GET_LINES'內容](https://stackoverflow.com/a/47831073/521799)(以及MyBatis) – 2017-12-19 15:26:35