MyBatis и DBMS_OUTPUT - PullRequest
       29

MyBatis и DBMS_OUTPUT

1 голос
/ 27 марта 2012

Я использую Oracle / MyBatis и пытаюсь отладить хранимую процедуру с огромным количеством параметров.Внутри хранимой процедуры я получаю ORA-01438: value larger than specified precision allowed for this column

Так что мой первоначальный подход заключается в том, чтобы сделать как dbms_output.put_line в хранимой процедуре, чтобы попытаться увидеть, какие значения находятся прямо перед оператором-нарушителем.Без MyBatis я обычно открывал сценарий sqlplus и набирал set serveroutput on, а затем запускал мою хранимую процедуру, чтобы увидеть, как выходят все сообщения отладки.С MyBatis я не могу понять, как (если возможно) получить эти операторы отладки.

У меня установлены отладчики ibatis и sql для DEBUG, и я использую log4j для регистрации всего для моего приложения Tomcat 6.

1 Ответ

3 голосов
/ 27 марта 2012

В пакете 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;
...