根据传递的列重用oracle中的函数

时间:2013-04-16 22:19:25

标签: sql database oracle plsql

我有一个函数,我希望以不同的方式工作,具体取决于传递的列。 我在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;

2 个答案:

答案 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)

我不会为此使用单一功能。如果在决定使用哪种算法时传递了哪个元素,那么这应该是两个函数。

我意识到有一些方法可以实现你想要的东西(我赞成运行算法的额外参数),但我认为你的目标存在根本缺陷。