PL / SQL:测试返回布尔值的函数

时间:2018-09-20 09:18:20

标签: oracle plsql

我正在尝试测试一个返回布尔值的PL / SQL函数。当我尝试使用下面的代码执行此操作时,出现错误:

  

ORA-06550:表达式的类型错误。

declare   
 v1 boolean; 
begin 
   select plsql_package.plsql_function('arg1', 'arg2') into v1 from dual;
   dbms_output.put_line('result = ' || v1);
end; 

2 个答案:

答案 0 :(得分:3)

它不会那样工作; DBMS_OUTPUT.PUT_LINE期望使用 strings ,而不是布尔数据类型,因此您必须将布尔数据类型变量的值“转换”为字符串-例如,使用CASE(就像我所做的那样)。看这个例子:

SQL> create or replace function plsql_function return boolean as
  2  begin
  3    return false;
  4  end;
  5  /

Function created.

SQL> set serveroutput on
SQL> declare
  2    v1 boolean;
  3  begin
  4    v1 := plsql_function;
  5    dbms_output.put_line('result ' || case when v1 then 'true' else 'false' end);
  6  end;
  7  /
result false

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:2)

您的代码中有两个错误:

  1. BOOLEAN数据类型是PL / SQL数据类型,因此在SQL范围内不存在

    CREATE FUNCTION test_fn RETURN BOOLEAN IS BEGIN RETURN FALSE; END;
    /
    
    declare   
      v1 boolean; 
    begin 
      select test_fn() into v1 from dual;
    end;
    /
    

    将失败

    ORA-06550: line 4, column 25:
    PLS-00382: expression is of wrong type
    

    因为您正在调用使用SQL返回仅PL / SQL数据类型的函数。

    相反,只需将函数结果分配给变量,而不使用SQL:

    declare   
      v1 boolean; 
    begin 
      v1 := test_fn();
    end;
    /
    
  2. 字符串串联运算符||DBMS_OUTPUT.PUT_LINE函数均不接受BOOLEAN参数。

    BEGIN
      DBMS_OUTPUT.PUT_LINE( FALSE );
    END;
    /
    

    将失败,并显示:

    ORA-06550: line 2, column 3
    PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
    

    DECLARE
      v2 VARCHAR2(20);
    BEGIN
      v2 := 'result = ' || FALSE;
    END;
    /
    

    将失败,并显示:

    ORA-06550: line 4, column 9
    PLS-00306: wrong number or types of arguments in call to '||'
    

    相反,您需要将BOOLEAN数据类型转换为它可以接受的格式,例如VARCHAR2 / CHAR

    DECLARE
      v1 BOOLEAN := FALSE;
    BEGIN
      DBMS_OUTPUT.PUT_LINE( 'result = ' || CASE WHEN v1 THEN 'true' ELSE 'false' END );
    END;
    /