MyBatis和DBMS_OUTPUT

时间:2012-03-26 21:52:34

标签: oracle debugging stored-procedures mybatis

我正在使用Oracle / MyBatis并尝试使用大量参数调试存储过程。在存储过程中,我得到ORA-01438: value larger than specified precision allowed for this column

所以我最初的方法是在存储过程中像dbms_output.put_line那样尝试查看在违规语句之前的值是什么。如果没有MyBatis,我通常会打开一个sqlplus脚本并输入set serveroutput on然后在稍后运行我的存储过程以查看所有调试消息。使用MyBatis,我无法弄清楚如何(如果可能的话)获取这些调试语句。

我为DEBUG设置了ibatis和sql调试器,我使用log4j记录我的Tomcat 6应用程序的所有内容。

1 个答案:

答案 0 :(得分: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;