Как я могу преобразовать целочисленную переменную в PLSQL для передачи в параметр логической процедуры? - PullRequest
1 голос
/ 29 октября 2019

Я пишу модульные тесты для существующей процедуры, которая имеет логические параметры. По мере выполнения тестов они будут хранить значения соответствующих параметров в таблице. Я хочу использовать переменные для установки столбцов параметров в таблице и перейти к процедуре. Есть ли способ перейти от целого числа (что я установлю в своей таблице) к процедуре (которая требует логических значений)?

Я попытался передать в процедуру значения 1/0 и строки "TRUE" и "FALSE". Я пытался заставить мою таблицу использовать логический тип данных для соответствующих столбцов. Я пробовал литье. Я попытался использовать SELECT INTO с оператором CASE, чтобы установить другую переменную логического типа на основе значения переменной целочисленного типа.

CREATE TABLE UNIT_TEST_RESULTS (
case VARCHAR2(50)
,includeLines NUMBER(1) --this will hold the value of i_includeLines below
,result VARCHAR2(4)
);

CREATE OR REPLACE PROCEDURE X_UNIT_TEST AS
i_includeLines NUMBER(1)
BEGIN
i_includeLines:=0;
X_THING_TO_TEST(includeLinesBool=>i_includeLines);

/*...analyze output...*/

INSERT INTO UNIT_TEST_RESULTS(case,includeLines,result)
VALUES ('test',i_includeLines,'fail'); COMMIT;

END X_UNIT_TEST;

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Я бы, вероятно, сделал что-то вроде

  i_includeLines NUMBER(1)
  b_includeLines boolean;
BEGIN
  i_includeLines:=0;
  b_includeLines := (case i_includeLines when 1 then true else false end);
  X_THING_TO_TEST(includeLinesBool=>b_includeLines);

или

  b_includeLines boolean;
  i_includeLines integer;
BEGIN
  b_includeLines:= false;
  X_THING_TO_TEST(includeLinesBool=>b_includeLines);

  /*...analyze output...*/

  i_includeLines := case when b_includeLines = true then 1 else 0 end;
  INSERT INTO UNIT_TEST_RESULTS(case,includeLines,result)
    VALUES ('test',i_includeLines,'fail'); 
  COMMIT;

Очевидно, что любое из этих операторов case может (и должно) быть инкапсулировано в функцию, предполагая, что выя буду звонить им регулярно.

Я бы посоветовал вам не использовать зарезервированное слово case для имени столбца - это в какой-то момент укусит вас. Я также не фанат венгерской нотации для имен переменных, но это скорее религиозные дебаты ...

0 голосов
/ 30 октября 2019

Не существует неявного преобразования чисел или строк в логическое значение, но простое выражение true / false, такое как i_includeLines = 1, оценивается как логическое true, если i_includeLines имеет значение 1, так что вы можете вызвать свою процедуру следующим образом:это:

x_thing_to_test(includeLinesBool => i_includeLines = 1);

Это пройдет true, если i_includeLines равно 1, false, если это не 1, иначе null.

Если вам нужно обработать нулькак false, тогда вам понадобится case / coalesce / nvl или подобное выражение.

0 голосов
/ 29 октября 2019

В вашем коде нет логического значения, поэтому - вот как я понял вопрос:

У вас есть процедура, которая принимает логический параметр:

SQL> create or replace procedure p_test
  2    (par_bool in boolean)
  3  is
  4  begin
  5    null;
  6  end;
  7  /

Procedure created.

SQL>

Вы хотите вызвать его;есть некоторая переменная число (в моем примере l_int), и вы хотите преобразовать ее в логическое значение и передать как таковую в процедуру p_test. Вот как это сделать:

SQL> declare
  2    l_int integer := 1;
  3  begin
  4    p_test(case when l_int = 1 then true else false end);
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...