2012-04-11 61 views
0

我想知道是否可能通過(任何方式都可以,也是黑客)一個條件(布爾)到Oracle中的用戶定義函數。是否可以將條件傳遞給Oracle用戶定義的函數?

比方說,我想是這樣的:

CREATE OR REPLACE FUNCTION SCHEMA.MY_FUNC (
    condition IN ???, 
    my_value IN NUMBER) RETURN NUMBER IS 
BEGIN 
    IF condition THEN 
     RETURN my_value + 1; 
    END IF; 
    RETURN my_value; 
END; 
+1

爲什麼不使用'BOOLEAN'? – 2012-04-11 10:47:27

+0

測試你的函數外的條件,然後將1或0傳遞給函數? – MatBailie 2012-04-11 10:59:57

+0

@PeterLang然後,我不能在純SQL語境中使用BOOLEAN。 – 2012-04-11 12:32:08

回答

3

假設你希望能夠從普通的SQL調用它 - 否則,你可以只使用一個BOOLEAN - 你可以傳遞一個固定值和解釋來代替。 0/1,Y/N等常見;使用1爲真(和其他任何爲假)例如:

CREATE OR REPLACE FUNCTION MY_FUNC (
    condition IN NUMBER, 
    my_value IN NUMBER) RETURN NUMBER IS 
BEGIN 
    IF condition = 1 THEN 
     RETURN my_value + 1; 
    END IF; 
    RETURN my_value; 
END; 
/

FUNCTION MY_FUNC compiled 

select my_func(0, 42) from dual; 
select my_func(1, 42) from dual; 

MY_FUNC(0,42) 
------------- 
      42 

MY_FUNC(1,42) 
------------- 
      43 

如果你可以通過表達作爲一個字符串,比方說,你可以砍一些與動態SQL一起,我想:

CREATE OR REPLACE FUNCTION my_func (
    condition IN varchar2, 
    my_value IN NUMBER) RETURN NUMBER IS 
    boolstr VARCHAR2(5); 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT CASE WHEN ' || condition 
     || ' THEN ''true'' ELSE ''false'' END FROM dual' INTO boolstr; 
    IF boolstr = 'true' THEN 
     RETURN my_value + 1; 
    END IF; 
    RETURN my_value; 
END; 
/

,你不得不調用諸如:

select my_func('1=1', 42) from dual; 

所以你必須開始構建你的病情爲一個字符串,如:

select my_func(a ||'='|| b, 42) from <some table with a and b columns>; 

這似乎相當笨拙,並允許幾乎所有的東西來作爲條件,這當然可能是危險的傳遞(SQL注入的可能性,說得客氣一點)。如果只有某些「條件」儘可能多,那麼可能會更好地使用函數包裝來獲取簡單的參數,並找出布爾條件值來調用實際函數,因此您可以調用類似my_func_eq(42, a, b)的東西。

我還會考慮一個函數是否真的是必要的 - 取決於函數的功能當然可以在一個簡單的查詢中獲得相同的效果,例如,與案件陳述。

+0

沒有機會直接使用像'SELECT my_func(a = b)'或不是'SELECT my_func(CASE WHEN a = b THEN 1 ELSE 0)'的東西嗎?對不起,我是Oracle新手...... * PS:函數創建後的'/'符號是什麼?我也看到它在Oracle文檔上,但我無法得到它,我沒有在我的測試中使用... * – 2012-04-11 12:33:47

+0

@ loernzo-s - 我添加了一個版本,顯示它可以傳遞一個字符串進行評估作爲一個條件,但可能並不一定是一個好主意。正如彼得所建議的那樣,請詳細說明你真正想要做什麼,以及爲什麼你認爲這個構造是需要的。 – 2012-04-11 13:37:08

+0

另外...您需要'/'來獲得PL/SQL塊 - 在這種情況下,創建函數 - 至少在從SQL * Plus或SQL Developer運行時執行。如果你在腳本中擁有它,並且這是它最後執行的最後一件事,但它通常是需要的,所以最好總是使用它來避免混淆。 – 2012-04-11 13:40:15

相關問題