2013-07-16 3 views
0

Хорошо, я написал основную функцию в оракуле, чтобы вернуть текущего сотрудника на основе идентификатора клиента и указанной даты.Несколько входов в параметры функции Oracle oracle

Он работает по назначению.

FUNCTION get_worker_new_test (p_id IN VARCHAR2, p_date IN DATE, w_type IN 
VARCHAR2)  RETURN VARCHAR2 IS 

CURSOR c1 IS 

SELECT 
O_RELATIONSHIPS.ID 

FROM o_relationships 
WHERE rel_source_per_gro_id = p_id 
AND rel_rty_code in (w_type) 
AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
ORDER BY rel_start_date DESC; 


l_name VARCHAR2(70) ; 

BEGIN 
OPEN c1; 
FETCH c1 INTO l_name; 
CLOSE c1; 

RETURN l_name; 

END; 

Так, например, запрос, как это:

SELECT 
CLIENT, 
get_worker_new_test(CLIENT,sysdate,'WORKER') 
FROM TABLE 

бы вернуть что-то вроде:

Client1 | A WORKER

Однако мне было интересно узнать, можно ли запросить функцию, чтобы вернуть последнего работника из нескольких разных типов работников.

Так, например, я бы написать запрос так:

SELECT 
CLIENT, 
get_worker_new_test(CLIENT,sysdate,'WORKER,CLERK,MANAGER') 
FROM TABLE 

И было бы вернуть:

client1 | A MANAGER

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

Спасибо.

+1

Почему потребность в функции вообще? Почему бы просто не присоединиться, когда вам нужно присоединиться? Не большой поклонник функций, которые просто скрывают SQL-запросы. Одна из проблем - это то, с чем вы сталкиваетесь, вам постоянно нужно учитывать растущие возможности пользовательских предикатов и придерживаться вашей функции. Я не буду касаться проблем с производительностью. – tbone

+0

Обычно я использую объединения, но я нахожу, что это информация, которую я постоянно использую в своих отчетах. Эта функция предназначена для меня и другого коллеги, пользователи не имеют доступа к ним. - Если у вас есть другие предложения, кроме функции, то я рад их услышать, но, вероятно, 90% отчетов, которые я пишу, обычно должны иметь в них какую-то информацию о работниках (рабочий, работник обзора, сотрудник и т. Д.), , – bawpie

+0

[Dynamic SQL] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm) – GriffeyDog

ответ

1

Быстрое и грязное решение # 1. Используйте следующий запрос в функции:

SELECT 
O_RELATIONSHIPS.ID 

FROM o_relationships 
WHERE rel_source_per_gro_id = p_id 
AND instr(','||w_type||',', ','||rel_rty_code||',') <> 0 --<-- Check comma-quoted worker type to be substring of parameter string 
AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
ORDER BY rel_start_date DESC; 

Быстрый и грязный раствор # 2. Создание SQL-тип:

create type uservchartab as table of varchar2(4000); 

Заменить функцию с этим кодом:

FUNCTION get_worker_new_test 
    (p_id IN VARCHAR2, p_date IN DATE, w_type IN uservchartab) 
    RETURN VARCHAR2 
IS 

    CURSOR c1 IS 
    SELECT O_RELATIONSHIPS.ID 
     FROM o_relationships 
     WHERE rel_source_per_gro_id = p_id 
     AND rel_rty_code member of w_type --<-- Check worker type to be one from the condition 
     AND p_date BETWEEN rel_start_date AND NVL(rel_end_date, SYSDATE) 
     ORDER BY rel_start_date DESC; 

    l_name VARCHAR2(70) ; 

BEGIN 
    OPEN c1; 
    FETCH c1 INTO l_name; 
    CLOSE c1; 

    RETURN l_name; 
END; 

Используйте это так:

SELECT CLIENT 
    , get_worker_new_test(CLIENT, sysdate, uservchartab('WORKER', 'CLERK', 'MANAGER')) 
    FROM TABLE 
+0

Спасибо за это, я пошел на QaD-решение №2, и он делает то, что мне нужно. к. Благодарю. – bawpie

Смежные вопросы