【问题标题】:MyBatis and DBMS_OUTPUTMyBatis 和 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 应用程序记录所有内容。

【问题讨论】:

    标签: oracle debugging stored-procedures mybatis


    【解决方案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;
    

    【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2016-03-02
    • 2015-01-19
    • 2019-01-02
    • 2017-06-15
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多