Estou tentando realizar a chamada de um cursor dinamicamente.Porém ele fica dá erro.
Alguém sabe se isso é possível?
Segue esboço do que pretendo fazer.
IF (a = b) THEN
OPEN cursor_1
LOOP
FETCH cursor_1
INTO reg_1;
EXIT WHEN cursor_1%NOTFOUND;
END LOOP
CLOSE cursor_1
ELSE
OPEN cursor_2
LOOP
FETCH cursor_2
INTO reg_2;
EXIT WHEN cursor_2%NOTFOUND;
END LOOP
CLOSE cursor_2
END IF;
DECLARE
cursor cursor_1 IS select 1 code from DUAL;
cursor cursor_2 IS select 2 code from DUAL;
cond NUMBER := 0;
reg_1 cursor_1%rowtype;
reg_2 cursor_2%rowtype;
BEGIN
IF (cond <> 0) THEN
FOR reg_1 IN cursor_1 LOOP
DBMS_OUTPUT.put_line('CODIGO: ' || reg_1.CODE);
END LOOP;
ELSE
FOR reg_2 IN cursor_2 LOOP
DBMS_OUTPUT.put_line('CODIGO: ' || reg_2.CODE);
END LOOP;
END IF;
END;
DECLARE
cursor cursor_1 IS select 1 code from DUAL;
cursor cursor_2 IS select 2 code from DUAL;
cond NUMBER := 0;
reg_1 cursor_1%rowtype;
reg_2 cursor_2%rowtype;
BEGIN
IF (cond = 0) THEN
DBMS_OUTPUT.put_line('Inicio cursor 1');
OPEN cursor_1;
LOOP
FETCH cursor_1
INTO reg_1;
EXIT WHEN cursor_1%NOTFOUND;
DBMS_OUTPUT.put_line('CODIGO: ' || reg_1.CODE);
END LOOP;
CLOSE cursor_1;
ELSE
DBMS_OUTPUT.put_line('Inicio cursor 2');
OPEN cursor_2;
LOOP
FETCH cursor_2
INTO reg_2;
EXIT WHEN cursor_2%NOTFOUND;
DBMS_OUTPUT.put_line('CODIGO: ' || reg_2.CODE);
END LOOP;
CLOSE cursor_2;
END IF;
END;
Acredito que seja isso aqui. (Com cursor explicito).
Opa Daniel beleza?
Cara vlw a ajuda. Mas compliquei agora um pouco mais =D
Seguinte a parte interna do loop(O que ele irá executar dentro do loop) será fixa... o que muda é a chamada do cursor
Para entender melhor:
tenho vários cursores... C_pai, c_filho1,c_filho2,c_filho3, c_neto1,c_neto2,c_neto3...
Abro o cursor c_pai e executo ele.
dentro do loop dele vou validar uma condicao de um de seus campos.
If (c_pai.filtro = talcoisa) then
Open c_filho1
else
open c_filho2
Endif
mas o loop dos filhos irá executar a mesma coisa...só muda qual cursor vou abrir... para evitar de colar a mesma coisa várias vezes... se eu não conseguir assim tou pensando em fazer uma função para cada cursor filho desses....
Não sei se consegui ser claro, qualquer coisa avisa ai.
Vlw
declare
type r_cursor is REF CURSOR;
c_cursor r_cursor;
my_sql varchar2(100);
cond NUMBER := 0;
---
saida varchar2(20);
begin
IF (cond = 0) THEN
my_sql := 'select 1 code from DUAL';
ELSE
my_sql := 'select 2 code from DUAL';
END IF;
open c_cursor for my_sql;
loop
fetch c_cursor into saida;
exit when c_cursor%notfound;
dbms_output.put_line(saida);
end loop;
close c_cursor;
end;
Só toma cuidado na saída para todos cursores Dinamicos terem mesmos campos e tipos e associar corretamente.
Humm vlw...
Meus cursores tem os mesmos campos... Tenho que pegar as mesmas informacoes mas dependendo de um filtro tenho que pegar as informações em um canto ou em outro... e além disso são regras diferentes sem chance de colocar em um só select =D
Vou testar aqui desta forma. Obrigado
declare
type r_cursor is REF CURSOR;
c_cursor r_cursor;
my_sql varchar2(100);
cond NUMBER := 0;
---
saida varchar2(20);
begin
IF (cond = 0) THEN
my_sql := 'select 1 um , 3 dois from DUAL';
ELSE
my_sql := 'select 2 um , 4 dois from DUAL';
END IF;
open c_cursor for my_sql;
loop
fetch c_cursor into saida;
exit when c_cursor%notfound;
dbms_output.put_line(saida.um);
end loop;
close c_cursor;
end;