2016-04-06 25 views
0

Oracle Stored prosedürü üzerinde çalışıyorum. Bir tablonun satırları üzerinde yinelemeliyim. Bunu kullanarak,Oracle DB SQL Prosedürü Dinamik tablo adıyla tablo üzerinde yineleme

FOR eachrow IN table_name 
LOOP 
END LOOP; 

Bunu yapmak için dinamik tablo_adı ihtiyacım var. Örneğin, tablo adları başka bir tabloda saklanır. Yani, bu tabloda ve döngü içinde FOR döngü yapabilirim, yeni tablonun satırları boyunca yinelemek istiyorum.

Lütfen bunu nasıl başarabileceğimi önerin. Bütün bazı örnek verilerin

İlk: Bu FOR eachrow IN table_name LOOP ile mümkün değildir

sayesinde
Kanat

+0

ve 'için loop' yapılması gerekenler istiyorsun? Seçilen satırlarla (sütunlar) ortak bir şey olmalı mı? –

+0

@Frank Bu tabloların her birine ait verilere ihtiyacım var –

+0

Verilerinde bir imleci kullanmanın neredeyse hiç gerekmediğini biliyor muydunuz, çünkü bu satır-satır-mantığı düz SQL kullanarak yeniden yazabilirsin? – dnoeth

cevap

2

, bunun yerine bir ref imleç kullanmak zorunda. Bu tabloların bazı ortak sütun adları vardır, iç döngüde yalnızca bu sütunlara erişebilirsiniz, bu benim yukarıda yazdığımda yazdığım şeydir. Sonuç türü iç döngüde aynı olmalıdır. İşte

create table froc_a(id number, name varchar2(10), row_added date); 
insert into froc_a values (1, '1', sysdate); 
insert into froc_a values (2, '2', sysdate - 2); 
insert into froc_a values (4, '4', sysdate - 4); 

create table froc_b(id number, name2 varchar2(10), row_added date); 
insert into froc_b values (1, 'b1', sysdate); 
insert into froc_b values (2, 'b2', sysdate - 2); 
insert into froc_b values (4, 'b4', sysdate - 4); 

create table froc_c(id number, txt varchar2(10), row_added date); 
insert into froc_c values (1, 'c1', sysdate); 
insert into froc_c values (2, 'c2', sysdate - 2); 
insert into froc_c values (4, 'c4', sysdate - 4); 

yazmak nasıl bir ilk yaklaşımdır:

declare 
    TYPE curtype IS REF CURSOR; 
    l_cursor curtype; 
    l_param_id number; 
    l_id  number; 
    l_val  varchar2(100); 
begin 
    l_param_id := 1; 

    -- Loop over your table names 
    for l_rec in (with tabnames(name) as 
        (select 'froc_a' 
        from dual 
        union all 
        select 'froc_b' 
        from dual 
        union all 
        select 'froc_c' 
        from dual) 
        select * from tabnames) loop 
    dbms_output.put_line(l_rec.name); 

    -- Open cursor for current table 
    open l_cursor for 'select id, row_added from ' || l_rec.name || ' where id = :1' 
     using l_param_id; 

    -- Loop over rows of current table 
    loop 
     fetch l_cursor 
     into l_id, l_val; 
     exit when l_cursor%notfound; 
     dbms_output.put_line(l_id || ', ' || l_val); 
    end loop; 
    end loop; 
end; 

Çıktı:

froc_a 
1, 06-APR-16 
froc_b 
1, 06-APR-16 
froc_c 
1, 06-APR-16