为啥我不能将布尔数据类型与立即执行一起使用?

Posted

技术标签:

【中文标题】为啥我不能将布尔数据类型与立即执行一起使用?【英文标题】:Why can't I use Boolean data type with Execute Immediate?为什么我不能将布尔数据类型与立即执行一起使用? 【发布时间】:2015-04-28 04:44:17 【问题描述】:
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 支持布尔数据类型。那么,这里有什么问题呢?

【问题讨论】:

您使用的是什么版本的 Oracle?我相信这将是版本相关的行为。根本问题是 boolean 不是 SQL 数据类型,它只是 PL/SQL 数据类型。 我用的是 11g,也更新了标签。 我认为你混淆了线条; --line 9 将抛出 PLS-00457: expressions have to be of SQL types--line 10 按预期工作。我认为错误文本几乎可以解释问题。为什么你没有把它从问题中排除? 这就是我所说的......当我注释掉 line 9 时它工作正常,但是当我注释 line 10 时它会抛出错误。我的问题是否解释了其他内容:S? 哦,对不起,我解释了commenting line 10 throws error 的意思,当一个注释掉第 10 行时,就会抛出一个错误。 (我的母语不是英语。) 【参考方案1】:

根据Oracle Documentation:

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

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

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

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

【讨论】:

以上是关于为啥我不能将布尔数据类型与立即执行一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::async 不能与接收抽象类引用作为参数的函数一起使用?

为啥我不能更新核心数据实体属性的布尔值?

为啥我存储在 Core Data 中的布尔值没有立即显示?

C#的EF中的字段类型布尔型,mysql数据库里是bit类型,提交识别不了该字段赋的true和false,为啥呢?

为啥 xmlignore 不能与 System.Timers.Timer 类一起使用

为啥 MySQL 不定义布尔数据类型?