Cursor não reconhecido

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
Eder
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 13 Jul 2010 10:38 am
Localização: MG

Bom dia Amigos!

Estou com um pequeno problema, quando crio uma variavel do tipo cursor, e no meio do script a abro e atribuo a ela dados de uma tabela, quando tento usar uma estrutura de for para trabalhar com estes dados é apresentado uma mensagem de erro. Para ilustrar, coloquei aqui um simples exemplo, mas o erro é o mesmo que apresenta no script aqui da minha empresa:

Selecionar tudo

declare 
type c_cursor is ref cursor;

c_testeCursor  c_cursor;

begin

open c_testeCursor for
     select swagreementid agree from sw_agreement where swagreementid between (1) and (11);
     
     for x in c_testeCursor loop
         dbms_output.put_line ('Acesso '||x.agree);
     
     end loop;

end;
Erro:
Ora-06550:line 11, column 15:
Pls-oo221:'C-testeCursor' is not a procedure or is undefined

O que pode ser? Desde já agradeço!
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Olá Eder, segue abaixo um exemplo usando sys_refcursor
não sei se é o que você precisava, mas da uma olhada, pode ser que ajude, qualquer coisa responde aii.

Selecionar tudo

declare
    c_cursor sys_refcursor;
    type tp_dados is record(
        texto varchar2(50));
    v_teste tp_dados;
begin
    open c_cursor for
        select 'teste 1' teste
          from dual
        union
        select 'teste 2' teste
          from dual;
    loop
        fetch c_cursor
          into v_teste;
        exit when c_cursor%notfound;
        dbms_output.put_line(v_teste.texto);
    end loop;
end;
Eder
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 13 Jul 2010 10:38 am
Localização: MG

Olá Diego, ajuda demais !! Obrigado pela atenção entendi seu modelo.

So tenho uma duvida:
Se quero trabalhar com os dados deste cursor , so que este cursor é proviniente de uma query que faz relacionamento com várias tabelas, e possui varias colunas, qual dica você me daria neste cenario.

Pois tenho que carregar dois cursores com informações distintas no meio do script para que apenas no final eu os comparar.

Desde já agradeço!
Eder
diego_amoroso
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Jul 2010 2:53 pm
Localização: Americana - SP
Diego Amoroso
Programador pl/sql
diego.amoroso@yahoo.com.br

Olá Eder, pelo que entendi você precisa validar(comparar) algumas informações, por isso você gostaria de te-las em cursores para fazer essa validação, mas é necessário realmente usar cursores? Se for apenas validar informações de querys, porque você não usa um FOR dentro de outro para fazer isso.
Pode ser que eu não tenha entendido o problema, mas acho que assim resolveria.

Ex:

Selecionar tudo

for reg_1 in (select codigo_1, descricao_1 
                     from tabela_teste_1) loop
    for reg_2 in (select codigo_2, descricao_2 
                         from tabela_teste_2) loop
        if reg_1.codigo_1 = reg_2.codigo_2 then
            ...
        else
            ...
        end if;
    end loop;
end loop;
No exemplo acima é como se tivesse dois selects distintos sendo comparados, o primeiro registro do primeiro select será comparado com todos os registros do segundo select, e assim vai com todos os registros.

Qualquer coisa responde aii, mas foi isso que entendi que você quer fazer.
falou!!!!
Eder
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 13 Jul 2010 10:38 am
Localização: MG

E ai Diego, beleza!

Gostei da ideia, vou tentar fazer isso.
Antes eu pensei em separar em dois cursores, pois as informaçoes a serem comparadas são da mesma tabela, exemplo tabela produto, antes de alterarmos alguns estados desta tabela eu tenho q armazenar seu estado.
Dai o script faz algumas validaçoes e dependendo da validação, ele ira alterar varias informaçoes desta mesma tabela produto. Dai eu armazenava este cenario em outro cursor.
Dai então, tive a ideia de comparar estes dois cursores para gerar um relatorio.

Desde já quero lhe agradecer.

Att,
Eder
Avatar do usuário
Bogos
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 06 Jul 2010 8:58 am
Localização: Americana / SP
Contato:

Olá Eder, pelo que entendi então você quer pegar as informações de um registro da tabela, em seguida fazer algumas alterações. Depois das alterações você pega as informações desse mesmo registro da mesma tabela e compara os dois cenários, é isso?

Só pra saber mesmo, qual o objetivo do seu problema para você utilizar essa solução?

Nesse caso seria melhor fazer o tratamento na trigger dessa tabela, pois lá você pode fazer comparações com os valores novos e antigos (:new e :old)

Só cuidado para não efetuar operações DML na mesma tabela da trigger para não ter o erro de trigger mutante.





ps. oi Dii! uhahuhua :roll:
Responder
  • Informação
  • Quem está online

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