我正在为具有布尔参数的现有过程编写单元测试。在测试运行时,它们会将关联的参数值存储在表中。我想使用变量来设置表中的参数列并传递给过程。有没有办法从整数(我将在表中设置的值)转到过程(需要布尔值)?
我尝试将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;
答案 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
或类似的表达式。