2009-09-23 95 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;