为什么我不能在Execute Immediate中使用布尔数据类型?

时间:2015-04-28 04:44:17

标签: plsql oracle11g boolean execute-immediate

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支持布尔数据类型。那么,这里的问题是什么?

1 个答案:

答案 0 :(得分:1)

根据Oracle Documentation

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

  

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

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

  

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