Problemas com PL/SQL

7 respostas
jtalr

Pessoal, sei que aqui não forum de Oracle, mas acredito muito na comunidade de usuarios do GUJ e talvez alguem consiga me ajudar.
O fato é que estou precisando construir uma procedure para restruturar alguns dados da minha base. O fato é que sempre executo a consulta

select distinct smt.cd_turma into numero_aluno 
                    from sugestao_matricula_turma smt  
                   where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma;

Ele me retorna 8 resultados, o que para mim é inadmissível, pois nu_matr_curso e cd_turma são chaves primaria da tabela sugestao_matricula_turma. Gostaria que alguem pudesse me explicar o que estou fazendo de errado.
A seguir o código da procedure completo:

create or replace procedure prc_sugestao_score_vest(periodoLetivo varchar2) is

  numero_aluno integer;
  cd_compnt_curr componente_curricular.cd_compnt_curr%type;
  cd_turno turno.cd_turno%type;
  cd_turma turma.cd_turma%type;
  scr_vest integer; 
  matr_curso vinculo.nu_matr_curso%type;
  
  cd_compnt_curr_turma componente_curricular.cd_compnt_curr%type;
  cd_turno_turma turno.cd_turno%type;
  cd_turma_turma turma.cd_turma%type;
  cursor c_aluno_compnt_curr is 
      select aa.cd_compnt_curr, tv.cd_turno, trunc(v.nu_escr_obtido_vest), v.nu_matr_curso, smt.cd_turma
      from sugestao_matricula_turma smt,
           turno_vinculo tv,
           atividade_academica aa,
           turma t,
           vinculo v
      where smt.nu_matr_curso=tv.nu_matr_curso
        and smt.cd_turma=t.cd_turma
        and t.cd_ativ_acad=aa.cd_ativ_acad
        and smt.fl_fera='1'
        and v.nu_matr_curso = smt.nu_matr_curso
      order by aa.cd_compnt_curr, tv.cd_turno, trunc(v.nu_escr_obtido_vest) desc;
        
  cursor c_turma_compnt_curr is
      select distinct aac.cd_compnt_curr, tvi.cd_turno, smt.cd_turma 
        from sugestao_matricula_turma smt,
             turma tur,
             atividade_academica aac,
             turno_vinculo tvi
       where smt.fl_fera = 1
         and tur.cd_turma = smt.cd_turma
         and tur.cd_ativ_acad = aac.cd_ativ_acad
         and tvi.nu_matr_curso = smt.nu_matr_curso
       order by aac.cd_compnt_curr, tvi.cd_turno, smt.cd_turma ;

begin
     open c_aluno_compnt_curr;
     FETCH c_aluno_compnt_curr INTO cd_compnt_curr, cd_turno, scr_vest, matr_curso, cd_turma;
     loop
         open c_turma_compnt_curr;
         loop
         FETCH c_turma_compnt_curr INTO cd_compnt_curr_turma, cd_turno_turma, cd_turma_turma;
         exit when c_turma_compnt_curr%notfound;
              if(cd_compnt_curr = cd_compnt_curr_turma and cd_turno = cd_turno_turma) then
                  select distinct smt.cd_turma into numero_aluno 
                    from sugestao_matricula_turma smt  
                   where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma;
                    DBMS_OUTPUT.PUT(numero_aluno);
                    DBMS_OUTPUT.PUT('-');
                    DBMS_OUTPUT.PUT('select count(*) into numero_aluno
                                       from sugestao_matricula_turma smt  
                                      where smt.nu_matr_curso = ');
                    DBMS_OUTPUT.PUT(matr_curso);
                    Dbms_Output.put('and smt.cd_turma = ');
                    DBMS_OUTPUT.put_line(cd_turma);
                    delete from sugestao_matricula_turma smt where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma;
                    insert into sugestao_matricula_turma (nu_matr_curso,cd_turma,fl_prio,fl_sugst,fl_fera) VALUES (matr_curso, cd_turma_turma, 1, 1, numero_aluno);
                    FETCH c_aluno_compnt_curr INTO cd_compnt_curr, cd_turno, scr_vest, matr_curso, cd_turma;
              end if;      
         end loop;
         close c_turma_compnt_curr;
         exit when c_aluno_compnt_curr%notfound;
     end loop;
     close c_aluno_compnt_curr;
end;

7 Respostas

sapulha

select distinct smt.cd_turma into numero_aluno from sugestao_matricula_turma smt where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma;
Se matr_curso e cd_turma estiverem sendo alimentadas com valores nulos, isso pode estar ocasionando o erro no seu select.

Verifique antes do select se as variáveis foram inicializadas com os valores corretos.

luis.soares

Se você executar o SQL direto no banco, sem passar pela procedures, ele também retorna 8 registros, ou somente no sql da procedure (que está em um cursor) ?

Abraço.

jtalr

Pois é, se você observar no script estou imprimindo os valores que estão nas variaveis

if(cd_compnt_curr = cd_compnt_curr_turma and cd_turno = cd_turno_turma) then select distinct smt.cd_turma into numero_aluno from sugestao_matricula_turma smt where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma; DBMS_OUTPUT.PUT(numero_aluno); DBMS_OUTPUT.PUT('-'); DBMS_OUTPUT.PUT('select count(*) into numero_aluno from sugestao_matricula_turma smt where smt.nu_matr_curso = '); DBMS_OUTPUT.PUT(matr_curso); Dbms_Output.put('and smt.cd_turma = '); DBMS_OUTPUT.put_line(cd_turma); delete from sugestao_matricula_turma smt where smt.nu_matr_curso = matr_curso and smt.cd_turma = cd_turma; insert into sugestao_matricula_turma (nu_matr_curso,cd_turma,fl_prio,fl_sugst,fl_fera) VALUES (matr_curso, cd_turma_turma, 1, 1, numero_aluno); FETCH c_aluno_compnt_curr INTO cd_compnt_curr, cd_turno, scr_vest, matr_curso, cd_turma; end if;
E quando executo somente a consulta ele me retorna ‘1’. O que esta acontecendo é que ele esta realizando a consulta considerando apenas uma parte da clausula where no caso, esta vendo apenas o campo nu_matr_curso. Alguem me ajuda pelo amor de Deus.

J

Por que você está utilizando um dbms_output.put_line ??

jtalr
para pular uma linha! não entendi a sua duvida?

DBMS.OUTPUT.PUT() = System.out.print()

DBMS.OUTPUT.PUTLINE() = System.out.println()

entendeu?

J

Ok, eu entendi. A pergunta acabou não sendo assim tão útil pra mim.

Mas você continua com os mesmos problemas??

O

Eu não verifiquei precisamente, mas não daria para unir os 3 selects em um só não? Pois aquele if tá com cara de join entre tabelas/views.

Criado 16 de novembro de 2006
Ultima resposta 17 de nov. de 2006
Respostas 7
Participantes 5