1

我有一个函数,我想根据传递的列以不同的方式工作。我在 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;
4

2 回答 2

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;

分享和享受。

于 2013-04-17T02:05:46.870 回答
0

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

我意识到有一些方法可以实现你想要的(我更喜欢运行哪个算法的额外参数),但我认为你的目标从根本上是有缺陷的。

于 2013-04-17T08:32:06.063 回答