为啥我不能将布尔数据类型与立即执行一起使用?
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 不能与接收抽象类引用作为参数的函数一起使用?
C#的EF中的字段类型布尔型,mysql数据库里是bit类型,提交识别不了该字段赋的true和false,为啥呢?