MyBatis 和 DBMS_OUTPUT

Posted

技术标签:

【中文标题】MyBatis 和 DBMS_OUTPUT【英文标题】:MyBatis and DBMS_OUTPUT 【发布时间】:2012-03-26 21:52:33 【问题描述】:

我正在使用 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】:

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;

【讨论】:

是的,我想我真的必须采用您提到的第二种方法,即开关。可能不值得为如何将其获取到 Tomcat 日志而付出额外的努力。 记录在案,here's how to fetch DBMS_OUTPUT.GET_LINES content from JDBC(因此来自 MyBatis)

以上是关于MyBatis 和 DBMS_OUTPUT的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习 之 一MyBatis简介与配置MyBatis+Spring+MySql

mybatis系列-16-spring和mybatis整合

mybatis映射 一对一,一对多,多对多高级映射

mybatis介绍和mybatis快速入门

Mybatis和mybatis-spring一级缓存

MyBatis和Mybatis-plus以及mybatis-spring的冲突解决