2015-06-23 5 views
-1

Я следующую таблицу:Возвращаясь несколько значений из функции в оракула

T_TYPE_ID T_TYPE  T_TYPE_PRICE T_TYPE_START_DATE T_TYPE_END_DATE  
    1  student  10.95  01.04.2015 00:00:00 30.06.2015 00:00:00 
    2  Concession 5.5  01.04.2015 00:00:00 30.06.2015 00:00:00 

мне нужно: Создать FUNC_get_ t_type_end_date function Эта функция должна содержать следующий параметр ввода: t_type_p и следующие выходные параметры: t_type_price_p и t_type_end_date_p. Он должен возвращать 1, если имеет запись с t_type как t_type_p, в противном случае возвращает 0. Кроме того, в случае наличия записи он должен назначить последние t_type_end_date на t_type_end_date_p и на t_type_price_p. Обратите внимание, что t_type_end_date_p может быть пустым; это означает, что соответствующая цена в настоящее время действительна.

Я написал следующий код:

CREATE OR REPLACE FUNCTION FUNC_get_t_type_end_date 
    (t_type_p IN VARCHAR2) 
RETURN NUMBER 
    AS 
    cnum NUMBER; 

    CURSOR cr1 IS 
    SELECT t_type 
     FROM ticket_type 
     WHERE t_type = t_type_p; 

    BEGIN 
    OPEN cr1; 
    FETCH cr1 INTO cnum; 
    IF cr1%NOTFOUND THEN 
     cnum := 0; 
     END IF; 
     CLOSE cr1; 

    RETURN cnum; 
    END; 

я не получал никакого понятия о том, как вернуть несколько значений из функции. Я использую оракул.

Подсказка:

create or replace FUNCTION FUNC_get_ t_type_end_date (…) 
return number 
as 
    -- define a variable to return a number and assign 0 to it 
    -- define a cursor to obtain t_type_price, t_type_end_date of the given t_type_p. The t_type_end_date values should be sorted in descending order – to do so the first record will contain either null or the latest of t_type_end_date 
BEGIN 
    -- open cursor 
    -- fetch the first record from the cursor to t_type_price_p and t_type_end_date_p 
    -- if (having a record) then … 
    -- close cursor 
    RETURN … 
END; 
+0

может быть вместо функции, вы можете использовать процедуру с параметрами 'out' –

+0

Ненавидите это префикс имени, которое вы там делаете. Это много лишних персонажей, которым все приходится набирать. –

+0

О, также, что явная методология курсора медленная, сложнее писать, сложнее поддерживать и, следовательно, больше подвержена ошибкам. –

ответ

2

Попробуйте это:

create or replace function func_get_t_type_end_date(t_type_p in varchar2, t_type_price_p out number, t_type_end_date_p out date) return number 
    as 
     cnum NUMBER; 

    CURSOR cr1 IS 
    SELECT t_type_price,t_type_end_date 
    FROM ticket_type t 
    WHERE t_type = t_type_p 
     and not exists (select 1 
            from ticket_type t2 
            where t2.t_type = t.t_type 
            and t2.t_type_end_date>t.t_type_end_date); 

    BEGIN 
    OPEN cr1; 
    FETCH cr1 INTO t_type_price_p,t_type_end_date_p; 
    IF cr1%NOTFOUND THEN 
     cnum := 0; 
      else 
      cnum := 1; 
     END IF; 
     CLOSE cr1; 

    RETURN cnum; end; 

Пример использования:

set serveroutput on 
declare 
v_result number; 
v_type_price_p number; 
v_type_end_date_p date; 
begin 
    v_result:=func_get_t_type_end_date(t_type_p=>'student',t_type_price_p=>v_type_price_p,t_type_end_date_p=>v_type_end_date_p); 
    dbms_output.put_line('Result: '||v_result); 
    dbms_output.put_line('Price: '||v_type_price_p); 
    dbms_output.put_line('End date: '||v_type_end_date_p);   
end; 
/
+0

Мне нужно использовать курсор для извлечения значений. – BinaryTerror

+0

Что мне делать, чтобы назвать fucntion? Должен ли я передавать только t_type или другие переменные? – BinaryTerror

+0

Необходимо указать все параметры. См. Пример в ответе. – ksa

4

Это не представляется возможным вернуть более одной переменной из функции. Тем не менее, можно вернуть тип настраиваемой переменной (то есть запись), который содержит несколько значений. Чтобы сделать это, вам нужно сначала определить тип содержит три переменные, которые вы хотите вернуться следующим образом:

TYPE new_type is record(cnum number, t_type_end_date_p timestamp, t_type_price_p timestamp); 

Затем вы можете использовать его в функции следующим образом:

CREATE OR REPLACE FUNCTION FUNC_get_t_type_end_date (t_type_p IN VARCHAR2) 
RETURN new_type AS 

new_type_variable newtype; 

CURSOR cr1 IS 
SELECT t_type 
    FROM ticket_type 
    WHERE t_type = t_type_p; 

BEGIN 
OPEN cr1; 
FETCH cr1 INTO cnum; 
IF cr1%NOTFOUND THEN 
    SELECT 0, null, null into new_type_variable from dual; 
ELSE 
    SELECT 1, cr1.t_type_end_date, cr1.t_type_price into new_type_variable from dual; 
END IF; 
    CLOSE cr1; 

RETURN new_type_variable ; 
END; 
+0

Я не знаю, что вы пытаетесь сделать. Пожалуйста, внимательно прочитайте вопрос. – BinaryTerror

+2

@ user3803989 Я пытаюсь вам помочь. Я правильно прочитал вопрос. Если что-то соответствует, уточните его – Hawk

+0

@ user3803989 Получите ошибку? – Hawk

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