2016-04-06 17 views
0

Oracleストアド・プロシージャを使用しています。 テーブルの行全体を反復処理する必要があります。私はそれを使用して行うことができます:Oracle DBのSQLプロシージャ動的テーブル・バイトを使用してテーブルを反復処理

FOR eachrow IN table_name 
LOOP 
END LOOP; 

しかし、私はテーブルの名前を動的にする必要があります。 たとえば、テーブル名は他のテーブルに格納されています。 それで、私はそのテーブルでループを行うことができますし、ループ内で、私は新しいテーブルの行を反復処理したいです。

私はそれをどのように達成できるかお勧めします。すべてのいくつかのサンプルデータの

まず:これはFOR eachrow IN table_name LOOPでは不可能である

おかげで、
サッシ

+0

と、あなたは 'のためloop'に何をすべきかをしたいですか?選択した行(列)と共通のものが必要ですか? –

+0

@Frankこれらの各テーブルのデータが必要です –

+0

プレーンSQLを使用してその行単位のロジックを書き直すことができるので、カーソルにデータを使用する必要はほとんどありません。 – dnoeth

答えて

2

は、あなたの代わりに参照カーソルを使用する必要があります。これらのテーブルにはいくつかのカラム名がありますが、内側のforループではこれらのカラムにしかアクセスできません。これは上のコメントで書いたものです。結果の型は内部ループ内で同じでなければなりません。

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; 

出力:ここ

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); 

はそれを書くためにどのように最初のアプローチである

froc_a 
1, 06-APR-16 
froc_b 
1, 06-APR-16 
froc_c 
1, 06-APR-16 
関連する問題