我正在尝试测试一个返回布尔值的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;
答案 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)
您的代码中有两个错误:
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;
/