假設你希望能夠從普通的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)
的東西。
我還會考慮一個函數是否真的是必要的 - 取決於函數的功能當然可以在一個簡單的查詢中獲得相同的效果,例如,與案件陳述。
爲什麼不使用'BOOLEAN'? – 2012-04-11 10:47:27
測試你的函數外的條件,然後將1或0傳遞給函數? – MatBailie 2012-04-11 10:59:57
@PeterLang然後,我不能在純SQL語境中使用BOOLEAN。 – 2012-04-11 12:32:08