2013-04-16 2 views
1

У меня есть функция, которую я хочу работать по-разному в зависимости от пройденного столбца. Я вызываю эту функцию в инструкции UPDATE. Если я передаю столбец A таблицы, тогда должен быть реализован случай 1 функции, и если я передам 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

Вы считали, что передаете второй аргумент, чтобы указать, что делать в функции? –

+0

Это хорошая идея ... Я могу передать второй аргумент как NULL .. В основном создайте функцию с двумя аргументами и когда используется col1, вызов подобен select test (col1, NULL) из double .. Если используется col2, выберите test (NULL, col2) из ​​dual; .. Внутри функции я буду использовать случай, если para1 равен NULL THEN .... Else ..... END –

+0

Я полагаю, что @ GordonLinoff означает передать два аргумента - значение col и строка 'colA'or'colB'.eg В вашем sql перед этой функцией выберите colA как para1, «colA» как para2 из таблицы ... – Gentlezerg

ответ

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; 

Делитесь и наслаждайтесь.

+0

Большое спасибо Бобу Джарвису. Большое спасибо за ваше время и усилия. –

0

Я бы не использовал одну функцию для этого. Если вопрос о том, какой элемент передается при определении того, какой алгоритм используется, то это должно быть две функции.

Я понимаю, что есть способы достижения того, что вы хотите (я бы предпочел дополнительный параметр, для которого нужно запустить алгоритм), но я думаю, что ваша цель здесь в корне ошибочна.