2
DECLARE dyn_stmt VARCHAR2(200);
b1 boolean;
FUNCTION f(x INTEGER) RETURN boolean AS
BEGIN
RETURN FALSE;
END f;
BEGIN
dyn_stmt := 'BEGIN :b := f(5); END;';
EXECUTE IMMEDIATE dyn_stmt USING OUT b1; --line 9
b1:=f(5);   --line 10
END;

评论第 10 行会引发错误,而评论第 9 行工作正常。为什么 ?根据错误“表达式必须是 SQL 类型”并且 AFAIK PL/SQL 支持布尔数据类型。那么,这里有什么问题呢?

4

1 回答 1

1

根据Oracle 文档

这特别适用于动态 PL/SQL(以及 SQL):

在运行时,绑定参数替换动态字符串中的相应占位符。每个占位符都必须与 USING 子句和/或 RETURNING INTO 子句中的绑定参数相关联。您可以使用数字、字符和字符串文字作为绑定参数,但不能使用布尔文字(TRUE、FALSE 和 NULL)。要将空值传递给动态字符串,您必须使用一种解决方法。请参阅“将空值传递给动态 SQL”。

这不适用于动态 PL/SQL(仅限 SQL),但为了完整性继续:

动态 SQL 支持所有 SQL 数据类型。例如,定义变量和绑定参数可以是集合、LOB、对象类型的实例和引用。动态 SQL 不支持特定于 PL/SQL 的类型。例如,定义变量和绑定参数不能是 BOOLEAN 或索引表。唯一的例外是 PL/SQL 记录可以出现在 INTO 子句中。

于 2015-04-28T04:57:51.230 回答