1

我正在尝试动态调用一个 PL/SQL 方法,该方法返回一个没有运气的布尔值。我已经四处寻找答案,但这似乎是不可能的。

这是我正在尝试做的一个非常简单的示例:

create or replace 
function test_ret_bool return boolean as 
begin
  return true;
end test_ret_bool;

然后是调用:

declare
  ret_val boolean;
  sql_stmt varchar2(1000);
begin  
  sql_stmt := 'select test_ret_bool() from dual';
  execute immediate sql_stmt into ret_val;
end;

这不起作用,产生错误:

ORA-06553: PLS-382: expression is of wrong type

我也尝试将 sql_stmt 更改为:

sql_stmt := 'begin :result := test_ret_bool(); end;';
execute immediate sql_stmt using out ret_val;

然后调用 PL/SQL 引擎,但这给出了这个错误:

PLS-00457: expressions have to be of SQL types

我已经看到其他线程描述了相同的问题,并且可能使用了包装函数。在我的情况下,我不可能使用包装函数。

我已经看到了一些关于为此使用 dbms_sql.execute() 的想法,但还没有让它发挥作用。

有人可以请教吗?有人可以提供一个使用 dbms_sql.execute() 的例子吗?

非常感谢!

4

3 回答 3

2

您可以使用 Oracle 函数SYS.DIUTIL.bool_to_intSYS.DIUTIL.int_to_bool.

于 2013-03-06T14:11:58.497 回答
1

您的功能很好,问题是 Oracle 不支持booleanSQL 中的数据类型。如果你想要这个,你要么必须使用纯 PL/SQL(如在 ABCade 的 SQLfiddle 中),要么将布尔值转换为 Y/N、1/0 或类似的值。

您可以在此处查看支持的数据类型。

于 2013-03-06T13:07:18.897 回答
-2

这是等价的。想要做什么:

SELECT * FROM dual WHERE 1=1; -- TRUE

SELECT * FROM dual WHERE 1=2; -- FALSE
于 2013-03-06T14:00:14.560 回答