2009-09-23 159 views
39

使用布尔类型有参数布尔一个PL/SQL函数:我如何在SELECT语句

function get_something(name in varchar2, ignore_notfound in boolean); 

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

我想用一个SELECT语句像这里面的这个功能:

select get_something('NAME', TRUE) from dual; 

这是不行的,我得到这个异常:

ORA-00904: “TRUE”:无效标识符

据我所知,关键字TRUE不被识别。

我该如何做这项工作?

回答

24

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

function get_something(name in varchar2, 
        ignore_notfound in varchar2) return varchar2 
is 
begin 
    return get_something (name, (upper(ignore_notfound) = 'TRUE')); 
end; 

然后调用:

select get_something('NAME', 'TRUE') from dual; 

这是给你什么ignore_notfound的有效值是在你的版本中,我假设“TRUE '表示TRUE,其他意味着FALSE。

+11

来自oracle,这是一个非常愚蠢的限制 – craigrs84 2014-08-12 19:59:08

+8

我很好奇Oracle如何在技术上证明这一点 – 2015-04-24 19:41:46

-1

PL/SQL抱怨说TRUE不是一个有效的标识符或变量。设置一个局部变量,将其设置为TRUE,并将其传递给get_something函数。

+4

不,甲骨文的SQL根本无法处理布尔值:-( – 2009-09-23 11:36:48

+0

另外,我想在一个视图定义使用此功能,而不是一个脚本里面 – 2009-09-23 11:44:46

+0

@Ula,托尼:那么我想包装的功能 – 2009-09-23 13:01:15

19

documentation

您不能插入值TRUEFALSE到数据库列。您无法将列值选择或提取到变量BOOLEAN中。从SQL查询中调用的函数不能使用任何BOOLEAN参数。既不能嵌入SQL功能,如TO_CHAR;代表在输出BOOLEAN值,则必须使用IF-THENCASE结构来翻译BOOLEAN值到一些其他类型,如01'Y''N''true''false',等等。

您需要制作一个包装函数,它需要一个SQL数据类型并使用它。

-1

如何使用其计算结果为TRUE(或FALSE)的表达式?

select get_something('NAME', 1 = 1) from dual 
+0

这是行不通的,我得到语法错误 – 2009-09-23 11:43:59

+1

不起作用... – GabrielOshiro 2014-07-25 16:32:39

2

将其编译到您的数据库中,并开始在查询中使用布尔语句。

注意:函数get的一个varchar2参数,所以一定要在语句中包装任何“字符串”。它将返回1为真,0为假;

select bool('''abc''<''bfg''') from dual; 

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
is 
begin 

execute immediate ' begin if '||P_str||' then 
      :v_res := 1; 
     else 
      :v_res := 0; 
     end if; end;' using out v_res; 

     return v_res; 

exception 
    when others then 
    return '"'||p_str||'" is not a boolean expr.'; 
end; 
/
38

您肯定可以从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 

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

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN 
FROM DUAL 

这将返回字符串'true'

+1

究竟是什么我一直在寻找,谢谢! – Baxter 2012-06-27 14:41:58

+2

尽管问题完全不相关,但问题不是“如何使用数字而不是布尔值”。 – cartbeforehorse 2017-04-23 16:22:45

3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;