我有一个函数,我希望以不同的方式工作,具体取决于传递的列。 我在UPDATE语句中调用该函数。 如果我传递一个表的col A,那么应该实现该函数的case1,如果我传递col B,那么应该考虑函数的case2部分。
我可以创建两个单独的函数,但如果可能的话,我想在一个函数中完成。
例如:
create or replace Function test( para1 in varchar2)
v_para varchar2;
BEGIN
****If paramater is coming from col A then perform 1st block Else perform 2nd block****
Begin
v_para := REGEXP_REPLACE (para1,'....');
v_para := .....
v_para := .....
Return varchar2
END
------------------------------------------------------
BEGIN
v_para := REGEXP_REPLACE(para1,'.....');
v_para := .....
Return varchar2
END
END;
答案 0 :(得分:1)
另一个选择是有两个参数,默认为NULL,你可以按名称传递,如:
CREATE OR REPLACE PROCEDURE TEST_PROC(colA VARCHAR2 DEFAULT NULL,
colB VARCHAR2 DEFAULT NULL) IS
BEGIN
IF colA IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('colA=' || colA); -- or do whatever
END IF;
IF colB IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('colB=' || colB); -- or do whatever
END IF;
END TEST_PROC;
然后,当您调用此过程时,请按名称传递要使用的参数,如:
DECLARE
rowTest_table TEST_TABLE%ROWTYPE;
BEGIN
SELECT *
INTO rowTest_table
FROM TEST_TABLE
WHERE SOMETHING = SOMETHING_ELSE;
TEST_PROC(colA => rowTest_table.A);
TEST_PROC(colB => rowTest_table.B);
END;
分享并享受。
答案 1 :(得分:0)
我不会为此使用单一功能。如果在决定使用哪种算法时传递了哪个元素,那么这应该是两个函数。
我意识到有一些方法可以实现你想要的东西(我赞成运行算法的额外参数),但我认为你的目标存在根本缺陷。