首页 文章

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

提问于
浏览
0

我正在尝试测试返回布尔值的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 回答

  • 2

    它不会像那样工作; DBMS_OUTPUT.PUT_LINE 需要字符串,而不是布尔数据类型,所以你必须"convert"一个布尔数据类型变量的值为一个字符串 - 例如,使用 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>
    
  • 2

    您的代码中有两个错误:

    • 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;
    /
    
    • 字符串连接运算符 ||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;
    /
    

相关问题