如何在PLSQL中转换整数变量以传递给布尔过程参数?

时间:2019-10-29 20:31:03

标签: oracle plsql

我正在为具有布尔参数的现有过程编写单元测试。在测试运行时,它们会将关联的参数值存储在表中。我想使用变量来设置表中的参数列并传递给过程。有没有办法从整数(我将在表中设置的值)转到过程(需要布尔值)?

我尝试将1/0值以及字符串“ TRUE”和“ FALSE”传递给该过程。我试图使我的表对相关列使用布尔数据类型。我尝试过CASTing。我尝试使用带有CASE语句的SELECT INTO来基于整数类型变量的值设置不同的布尔类型变量。

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 个答案:

答案 0 :(得分:2)

我可能会做类似的事情

  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用作列名,这会在某些时候给您带来麻烦。我也不是匈牙利人对变量名的称呼,但这更像是一场宗教辩论...

答案 1 :(得分:0)

您的代码中没有布尔值-这就是我对问题的理解方式:

您有一个接受布尔值参数的过程:

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

Procedure created.

SQL>

您想称呼它;有一些 number 变量(在我的示例中为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>

希望对您有帮助。

答案 2 :(得分:0)

没有从数字或字符串到布尔值的隐式转换,但是如果i_includeLines = 1的值为true,则简单的true / false表达式(如i_includeLines会得出布尔值1。 ,因此您可以这样调用程序:

x_thing_to_test(includeLinesBool => i_includeLines = 1);

如果true为1,则i_includeLines将通过false,否则为null

如果您需要将null视为false,则需要case / coalesce / nvl或类似的表达式。