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 fetchDBMS_OUTPUT.GET_LINES
content from JDBC(因此来自 MyBatis)以上是关于MyBatis 和 DBMS_OUTPUT的主要内容,如果未能解决你的问题,请参考以下文章