【发布时间】:2011-11-08 15:25:08
【问题描述】:
为了允许超级用户/管理员登录我的系统,我正在运行(更大版本的)这个查询:
Select *
From mytable
Where (:id = 'Admin' Or :id = mytable.id);
如果我传递一个用户 ID,我会得到该用户的所有数据;如果我传递字符串 'Admin' 我得到 all 数据。 这是可行的,因为 Oracle 的 OR 是 short-circuit operator。
但是,如果我将 'Admin' 设为包常量并使用函数获取它,就像这样
Select *
From mytable
Where (:id = mypackage.GetAdminConstant Or :id = mytable.id);
当我通过“管理员”时,我得到ORA-01722: invalid number。
当我引入一个函数时,为什么 OR 会失去它的短路特性?
【问题讨论】:
-
并非如此。我能找到的文档说它 is 短路;这似乎是规则的一个例外,我想知道为什么。
-
:id是什么(是绑定???),mypackage.GetAdminConstant是什么类型? -
是的,
:id是一个绑定变量。mypackage.GetAdminConstant返回 Varchar2。
标签: sql oracle plsql short-circuiting