loop по динамическому sql

AlexVin
Дата: 20.11.2008 22:19:38
oracle 9i
без кавычек вокруг селекта работает ) , но мне надо менять имя таблицы.
возможно ли сделать подобное без refcursor, execute immediate, переменных и fetch?
упрощенный пример:
declare 
 cursor c is 'select * from dual';
begin
  for tb in c loop
   null; -- дела
  end loop;  
end;
или так:
declare 
 t varchar2(50) := 'dual';
begin
  for tb in ('select * from '||t) loop
   null; -- дела
  end loop;  
end;
понимаю, что чушь пишу, ну нет так нет...
dmidek
Дата: 20.11.2008 22:42:38
Посмотрите OPEN FOR - курсор.
В нем можно использовать и динамический SQL.
AlexVin
Дата: 21.11.2008 06:39:17
я уже понял почему неправ
  for tb in ('select * from dual') loop
-- все затевалось ради использования
   ... tb.dummy ... -- а это скомпилировать оракел по неизвестному sql не сумеет 
  end loop;  
Alexander Konakov
Дата: 24.11.2008 15:23:49
AlexVin,
ну FOR LOOP по REF-курсору так использовать не получится, а вот так - вполне себе можно:

CREATE TABLE a (n NUMBER, c VARCHAR2(10));
CREATE TABLE b (n NUMBER, c VARCHAR2(10));

INSERT INTO a VALUES (1, 'A');
INSERT INTO a VALUES (2, 'A');
INSERT INTO b VALUES (1, 'B');
INSERT INTO b VALUES (2, 'B');

DECLARE
   TYPE TRec IS RECORD (n NUMBER, c VARCHAR2(10));
   rec TRec;
   cur SYS_REFCURSOR;
   l_QueryA VARCHAR2(100) := 'SELECT a.n, a.c FROM a';
   l_QueryB VARCHAR2(100) := 'SELECT * FROM b';
BEGIN
   dbms_output.put_line(l_QueryA);
   OPEN cur FOR l_QueryA;
   LOOP
     FETCH cur INTO rec;
     EXIT WHEN cur%NOTFOUND;
     dbms_output.put_line('Column N = ' || rec.n ||', Column C = ' || rec.c);
   END LOOP;
   --
   dbms_output.new_line;
   --
   dbms_output.put_line(l_QueryB);
   OPEN cur FOR l_QueryB;
   LOOP
     FETCH cur INTO rec;
     EXIT WHEN cur%NOTFOUND;
     dbms_output.put_line('Column N = ' || rec.n ||', Column C = ' || rec.c);
   END LOOP;
END;

-------------------------------------

SELECT a.n, a.c FROM a
Column N = 1, Column C = A
Column N = 2, Column C = A
 
SELECT * FROM b
Column N = 1, Column C = B
Column N = 2, Column C = B