是否可以将条件传递给Oracle用户定义的函数?
我想知道是否可能通过(任何方式都可以,也是黑客)一个条件(布尔)到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;
假设你希望能够从普通的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)
的东西。
我还会考虑一个函数是否真的是必要的 - 取决于函数的功能当然可以在一个简单的查询中获得相同的效果,例如,与案件陈述。
没有机会直接使用像'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
@ loernzo-s - 我添加了一个版本,显示它可以传递一个字符串进行评估作为一个条件,但可能并不一定是一个好主意。正如彼得所建议的那样,请详细说明你真正想要做什么,以及为什么你认为这个构造是需要的。 – 2012-04-11 13:37:08
另外...您需要'/'来获得PL/SQL块 - 在这种情况下,创建函数 - 至少在从SQL * Plus或SQL Developer运行时执行。如果你在脚本中拥有它,并且这是它最后执行的最后一件事,但它通常是需要的,所以最好总是使用它来避免混淆。 – 2012-04-11 13:40:15
为什么不使用'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