PL / SQL: выполнить процедуру в другой процедуре - PullRequest
0 голосов
/ 22 октября 2018

Я выполняю процедуру в другой процедуре.

Процедура 1:

CREATE OR REPLACE PROCEDURE proc_test_status_table(
     p_test_description IN VARCHAR2,
     p_test_status IN varchar2)
   AS
   l_sql VARCHAR2(4000);
  BEGIN
  l_sql := 'insert into test_status_table(test_description, test_status)
            values
            ( '''||p_test_description||''',
              '''||p_test_status||''')';

  EXECUTE IMMEDIATE (l_sql);

END;
/

Процедура 2:

overriding member procedure after_calling_test(self in out nocopy ut_documentation_reporter, a_test ut_test) as
    l_message varchar2(4000);
    l_test_description VARCHAR2(1000);
    l_test_status VARCHAR2(100);
  begin
    l_message := coalesce(a_test.description, a_test.name)||' ['||round(a_test.execution_time,3)||' sec]';
    Dbms_Output.Put_Line(a_test.result||'test_result');
    --if test failed, then add it to the failures list, print failure with number
    if a_test.result = ut_utils.gc_disabled then
      self.print_yellow_text(l_message || ' (DISABLED)');
      l_test_description := 'DISABLED';
      proc_test_status_table(l_message, l_test_description);

    elsif a_test.result = ut_utils.gc_success then
      self.print_green_text(l_message);
      l_test_description := 'PASS';
      proc_test_status_table(l_message, l_test_description);


    elsif a_test.result > ut_utils.gc_success then
      failed_test_running_count := failed_test_running_count + 1;
      self.print_red_text(l_message || ' (FAILED - ' || failed_test_running_count || ')');
      l_test_description := 'FAIL';
      proc_test_status_table(l_message, l_test_description);

    end if;

    -- reproduce the output from before/after procedures and the test
    self.print_clob(a_test.get_serveroutputs);
  end;

Она не сохраняет сообщение и описание в таблице test_status_table , нокогда я печатаю их, это отображается.

Я что-то не так делаю?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Возможно, вам просто нужно зафиксировать ваше зарегистрированное сообщение в процедуре.

Ведение журнала - это один из немногих случаев, когда автономная транзакция действительна: обычно мы хотим регистрировать наши сообщения без вмешательства в транзакцию, которую мы регистрируем.

Кроме того, вам не нужноиспользовать динамический SQL здесь.Просто обратитесь к параметрам в предложении VALUES.

CREATE OR REPLACE PROCEDURE proc_test_status_table(
     p_test_description IN VARCHAR2,
     p_test_status IN varchar2)
AS
    l_sql VARCHAR2(4000);
    PRAGMA autonomous_transaction;
BEGIN
    insert into test_status_table(test_description, test_status)
    values ( p_test_description, p_test_status);
    commit;
END;
/ 

Какое значение здесь AUTONOMOUS_TRANSACTION?ОП, по-видимому, создает основу для тестирования.С автономной транзакцией мы можем сохранить сообщение журнала, не затрагивая более широкую транзакцию, то есть тест.Передача сообщений журнала без прагмы AUTONOMOUS_TRANSACTION может иметь побочные эффекты, которые могут нарушить другие тесты (такие как ORA-01022, ORA-1555) или просто усложнить разбор.

0 голосов
/ 14 ноября 2018

Вы забыли совершить.После каждого оператора вставки должна быть зафиксирована фиксация, если вы хотите сохранить ее в таблице.

0 голосов
/ 22 октября 2018

Вы пропустили commit; оператор

После прямой вставки пути: таблица не может быть прочитана, пока вставка не будет зафиксирована.

Добавитьсовершить в конце процедуры для просмотра вставленных записей

...