我正在使用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应用程序的所有内容。
答案 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;