2012-03-26 89 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