Предполагая, что вы хотите, чтобы иметь возможность вызвать его из простой 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'? –
Проверьте состояние вне вашей функции, затем передайте 1 или 0 функции? – MatBailie
@PeterLang Я не могу использовать BOOLEAN в простом контексте SQL. –