如何在SELECT语句中使用BOOLEAN类型

Ula*_*kar 55 sql oracle plsql oracle10g ora-00904

我在参数中有一个带有BOOLEAN的PL/SQL函数:

function get_something(name in varchar2, ignore_notfound in boolean);
Run Code Online (Sandbox Code Playgroud)

此功能是第三方工具的一部分,我无法改变这一点.

我想在SELECT语句中使用这个函数,如下所示:

 select get_something('NAME', TRUE) from dual;
Run Code Online (Sandbox Code Playgroud)

这不起作用,我得到这个例外:

ORA-00904:"TRUE":标识符无效

据我了解,关键字TRUE无法识别.

我怎样才能做到这一点?

Ash*_*Ash 47

您绝对可以从SELECT查询中获取布尔值,您只能使用布尔数据类型.

您可以使用1/0表示布尔值.

CASE WHEN (10 > 0) THEN 1  ELSE 0 END (It can be used in SELECT QUERY)

SELECT CASE WHEN (10 > 0) THEN 1  ELSE 0 END AS MY_BOOLEAN_COLUMN
  FROM DUAL
Run Code Online (Sandbox Code Playgroud)

返回1(在Hibernate/Mybatis/etc 1中为真).否则,您可以从SELECT获取可打印的布尔值.

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
 FROM DUAL
Run Code Online (Sandbox Code Playgroud)

这将返回字符串'true'.

  • 尽管与这个问题完全无关.问题不是"我如何使用数字而不是布尔值". (3认同)

Ton*_*ews 28

你可以构建一个这样的包装器函数:

function get_something(name in varchar2,
                   ignore_notfound in varchar2) return varchar2
is
begin
    return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;
Run Code Online (Sandbox Code Playgroud)

然后打电话:

select get_something('NAME', 'TRUE') from dual;
Run Code Online (Sandbox Code Playgroud)

这取决于你的版本中ignore_notfound的有效值是什么,我假设'TRUE'表示TRUE,其他任何表示FALSE.

  • 来吧,这是一个非常愚蠢的限制 (17认同)
  • 我很好奇Oracle如何在技术上证明这一点. (8认同)
  • 事实上,Ask Tom(oracles oracle)在他的回答中居高临下地说 char(1) ('Y'/'N') “具有相同的目的”。https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6263249199595 (4认同)

Qua*_*noi 20

来自文档:

你可以不插入值TRUE,并FALSE进入数据库列.您无法选择或将列值提取到BOOLEAN变量中.从SQL查询调用的函数不能接受任何BOOLEAN参数.也没有内置SQL功能,如TO_CHAR; 要表示BOOLEAN输出中的值,必须使用IF-THENCASE构造将BOOLEAN值转换为其他类型,例如0or 1,'Y'or 'N','true''false'等等.

您需要创建一个包含SQL数据类型并使用它的包装函数.


Jua*_*nZe 5

BOOLEAN数据类型是PL/SQL数据类型.Oracle不提供等效的SQL数据类型(...),您可以创建一个将SQL类型映射到BOOLEAN类型的包装函数.

请查看:http://forums.datadirect.com/ddforums/thread.jspa?threadID = 1771&tstart = 0&messageID = 5284