utPLSQL - передача аргумента (l_message) в процедуру.Не передавая значение. - PullRequest
0 голосов
/ 12 октября 2018

У меня есть процедура, которая вставляет значения в таблицу.

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;
/

on ut_documentation_reporter Я изменил процедуру after_calling_test для кода:

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 VARCHAR(1000);
l_test_status VARCHAR(100);                                             
begin
l_message := coalesce(a_test.description, a_test.name)||' ['||round(a_test.execution_time,3)||' sec]';
--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';

  --calling procedure
  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';

  --calling procedure
  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';

  --calling procedure
  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;

аргументы не передаются.Я также не могу напечатать значение внутри процедуры.Я хочу добавить сообщение о статусе теста / описание в существующую таблицу.

Ответы [ 2 ]

0 голосов
/ 17 января 2019
  1. Вам не хватает commit.
  2. Обязательно сделайте эту автономную транзакцию, в противном случае вы фиксируете все, включая изменения, сделанные тестом.
  3. СоздайтеПользовательский репортер (например, my_reporter), чтобы сделать эту вставку.Таким образом вы разделяете обязанности и не теряете свои изменения всякий раз, когда вы переустанавливаете / обновляете utPLSQL.
  4. , запускайте тесты с несколькими репортерами, используя utplsql-cli.
  5. При использовании динамического sql используйте переменные связывания - не объединяйте - ваш SQL будет намного быстрее, а также намного безопаснее (устойчивее к SQL-инъекциям)

Пример:

create or replace procedure proc_test_status_table(
  p_test_description in varchar2,
  p_test_status in varchar2
) as    
  pragma auotonomous_transaction;
  l_sql varchar2(4000);
begin

  execute immediate 
    'insert into test_status_table(test_description, test_status)
     values( :desc, :stataus )'
     using p_test_description, p_test_status;
  commit;
end;
/

create or replace type my_reporter under ut_reporter_base(
  constructor function my_reporter(self in out nocopy my_reporter) return self as result,
  overriding member procedure before_calling_test(self in out nocopy my_reporter, a_test ut_test),
  overriding member procedure after_calling_test(self in out nocopy my_reporter, a_test ut_test),
  overriding member function get_description return varchar2

)
/

create or replace type body my_reporter as

  constructor function my_reporter(self in out nocopy my_reporter) return self as result,
  begin
    self.init($$plsql_unit);
    return;
  end;
  overriding member procedure before_calling_test(self in out nocopy my_reporter, a_test ut_test) is 
  begin 
    proc_test_status_table(
      coalesce(a_test.description, a_test.name),
      'Starting'
    );  
  end;
  overriding member procedure after_calling_test(self in out nocopy my_reporter, a_test ut_test) is 
  begin 
    proc_test_status_table(
      coalesce(a_test.description, a_test.name)||' ['||round(a_test.execution_time,3)||' sec]',
      ut_utils.test_result_to_char(a_test.result)
    );  
  end;
  overriding member function get_description return varchar2 is
  begin
    return 'My custom reporter to insert test status data into test_status_table';
  end;

end;
/
0 голосов
/ 30 ноября 2018

Возможно, вы пропустили COMMIT в процедуре.Оператор вставки требует фиксации для вставки данных в таблицу.

...