2012-04-11 59 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

相关问题