:
はのは、私のような何かをしたいとしましょう。 0/1、Y/Nなどは共通です。あなたは、文字列として式を渡すことができる場合、たとえば、あなたは、動的SQLと一緒に何かをハック可能性が
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
を 私が思う:例えば1として、真(偽として何か)を使用して
だから、あなたは同じように、文字列にあなたの条件アップを構築する必要があると思います
select my_func('1=1', 42) from dual;
:あなたは次のように呼び出す必要があるだろう
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(a ||'='|| b, 42) from <some table with a and b columns>;
これはかなり扱いにくいようで、ほとんど何ももちろん危険かもしれ条件として渡すことができます(SQLインジェクションの可能性を、穏やかにそれを置くために)。できるだけ特定の '条件'しかないのであれば、簡単な引数をとり、真の関数を呼び出すブール条件値を求める関数ラッパーを持つ方が良いかもしれないので、my_func_eq(42, a, b)
のようなものを呼び出します。
私はまた、関数が本当に必要かどうかを検討したいと思います。もちろん、関数が何をしているかによって、簡単なクエリで同じ効果を得ることができます。ケースステートメント。
なぜ、「BOOLEAN」を使用しないのですか? –
関数の外部で条件をテストし、1または0を関数に渡しますか? – MatBailie
@PeterLang単純なSQLコンテキストではBOOLEANを使用できません。 –