2016-04-04 20 views
-1

ofset alın. Mevcut satırdan önceki, ikinci, olan satırı döndürmem gerekiyor. Örneğin. 1, bir sonraki satır, -1 önceki satır, 2, geçerli değerden ikinci satır anlamına gelir.bir tanımladığı sonraki satır ben bir tamsayı parametre alır bir işlevi vardır oracle PL/SQL

Başka bir deyişle, işlev önce bir, bir sonraki, bir önceki veya aynı satırı temsil eden bir değişkene değer kaydetmelidir. Bu, fonksiyonun beklediği bir ofset parametresi ile tanımlanır. Aşağıdaki kod, ofset değerini sadece geçerli satır değerine ekler veya çıkarır.

işlevi de ofset baskı olması gerekmektedir satır tam olarak belirlemek amacıyla, ambalaj arayüzünden bir küresel değişkeni kullanır.

function my_function (v_offset integer) 
    return number 
    is 

    var flight.flightID%TYPE; 

    BEGIN 
    if v_offset>0 then 
    select something 
    INTO var 
    from somewhere 
    where id = v_global + v_offset; 
    else 
    select something 
    INTO var 
    from somewhere 
    where id = v_global-givennr; 
    end if; 
    RETURN var; 

    end my_function; 
/

Bu benim kodum şu ana kadar.

+0

Evet sadece bir parametre. –

+0

global bir değişkende tanımlanmıştır çünkü bir paketin içinde. –

+0

Sadece yükledim ... –

cevap

1

LAG ve KURŞUN analitik fonksiyonu. LAG (sütun_sayısı, ofset) üzeri (xxx ile sipariş). Tablonuzun sütun kimliği ile sipariş edildiğini varsaydım.

LAG - Bir önceki satırlardan dönüş değeri. LEAD - sonraki satırlardan dönüş değeri.

create table somewhere(id number, something varchar2(20)); 

-- populate table with data. 
    insert into somewhere 
select level, chr(64+ level) from dual 
connect by level < 25; 

declare 
    v_global number :=10; 
    p_offset number :=-5; 
    v_resutl varchar2(20); 
begin 

    select val into v_resutl from (
    select id, case when p_offset >0 then lead(something,abs(p_offset)) over(order by id) 
        when p_offset<0 then lag(something,abs(p_offset)) over(order by id) 
        when p_offset =0 then something end val 
    from somewhere) where id = v_global; 

dbms_output.put_line(v_resutl); 
end;