Chamar cursor condicionalmente

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Olá Pessoal.

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.

Selecionar tudo

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;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

É viável sim:

Selecionar tudo

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;
Teste e avisa.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Da tua forma:

Selecionar tudo

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).
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

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
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Não foi muito claro, ehhehehee. Mas entendi.
Creio que cursor dinâmico resolva teu problema (ao menos o problema referente a este programa, :P).

Faça algo do tipo:

Selecionar tudo

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.
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

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
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Opa Daniel,
A forma como você mostrou parece que vai servir sim.

Porém estou tendo problema em chamar campos separados... Ele dá erro de referencia inválida.

Selecionar tudo

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;
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Eu consigo utilizar o %ROWTYPE com esses cursores dinâmicos? Ou terei que criar uma variável para cada campo?

Selecionar tudo

reg_cursor         c_cursor_din%ROWTYPE;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Você pode criar um record com os campos/tipos para passar o resultado do cursor para ele.
Afinal um rowtype é um record menos trabalhoso :).
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes