Iniciante Procedure Complexa

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
strvocal
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 24 Ago 2010 10:03 am
Localização: Rio de Janeiro

Bom dia!

Gostaria da ajuda de vocês para a seguinte situação:

Preciso criar uma procedure. Já tentei de diversas formas diferentes mas não achei a ideal. Vou demonstrar abaixo.

-> Função recebe numero da identidade.
-> A partir desse numero, encontra a matrícula da pessoa no banco.
-> A partir da matrícula, a função segue:

-> Função verifica numa tabela, o ano letivo da pessoa:
->Se o campo "ano letivo" = ultimo, informa "Concluído"
->Se o campo "ano letivo" for diferente de ultimo e campo "matérias" estiverem vazias, retorna "Ainda não concluiu"
->Se o campo "ano letivo" for diferente de ultimo e campo "matérias" não estiverem vazias, retorna "Ainda não concluiu" e retorna as matérias que faltam

Enfim, é isso! :-o
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

Como tu vai saber se é o último ano? Tem um campo nesta tabela que informa qual último ano?
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

Ta...Eu fiz de um jeito muito podre, e não testei, e nem vi se funciona...Mas só pra te dar um help mesmo.
Dá pra fazer de outro jeito sem os "into" nos selects, e eu usei cursor dinâmico.

Selecionar tudo

CREATE OR REPLACE FUNCTION blabla (p_identidade IN NUMBER, p_cursor OUT SYS_REFCURSOR, p_retorno OUT VARCHAR2) IS

v_matricula VARCHAR2(30);
v_ano_letivo VARCHAR2(30);
v_ultimo_ano VARCHAR2(30);
v_materias VARCHAR2(30);

BEGIN

  BEGIN
  SELECT matricula
    INTO v_matricula
    FROM tabelaPessoas
  WHERE identidade = p_identidade;
  EXCEPTION 
  WHEN no_data_found THEN
    v_matricula := 'Não Existe!';
  END;
  
  BEGIN
  SELECT ano_letivo,
         ano_fim,
         materias
    INTO v_ano_letivo,
         v_ultimo_ano,
         v_materias
    FROM tabelaAnos
   WHERE ROWNUM = 1
     AND matricula_pessoa = v_matricula;
  WHEN no_data_found THEN
    v_matricula := 'Ralou!';   
  END;
  
  
  IF v_ano_letivo != v_ultimo_ano THEN
     retorno := 'Concluído';
  END IF;
  IF v_ano_letivo != v_ultimo_ano
     retorno := 'Ainda não concluiu';
     IF v_materias IS NOT NULL THEN
          OPEN p_cursor FOR 
          SELECT materias 
            FROM tabelaAnos
           WHERE matricula_pessoa = v_matricula;
     END IF;
  END IF;    

END blabla;
strvocal
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 24 Ago 2010 10:03 am
Localização: Rio de Janeiro

LixX, obrigado pela ajuda!

Sua função me deu uma direção para onde eu deveria seguir, e as primeiras partes eu já ajeitei e ficaram ok. O que está pegando agora é esse IF do final.

Usei sua sugestão e fiz uma Query com os "intos" e consigo trazer todas as informações que são necessárias abaixo, mas eu to tentando fazer isso aqui embaixo e não consigo:


IF ANO_LETIVO = ULTIMO_ANO THEN "CONCLUIDO" (Essa é tranquila)

IF ANO LETIVO <> ULTIMO_ANO AND MATÉRIAS IS NULL THEN "EM ANDAMENTO"

IF ANO LETIVO <> ULTIMO_ANO AND MATÉRIAS IS NOT NULL THEN "EM ANDAMENTO" AND "DESCRIÇÃO DAS MATÉRIAS"

Consegui explicar melhor?
Desde já muito obrigado pela ajuda.
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

Explicar o que eu fiz??
Se esta informação de último está na tabela, tu coloca numa variável e faz a verificação que tu quiser...
se for nulo o retorno irá receber "Em andamento"
se não for nulo e tiver materias, então tu abre um cursor dinâmico (que é o out sys_refcursor da function) e coloca os dados de matérias lá...
Isto é, quando alguém chamar esta função, passando 3 variáveis, 1 com a identidade, outra com uma variável que deseja receber a situação, e outro um cursor por referência que deseja saber as matérias que a pessoa está matriculada!
Eu recentemente respondi como se utiliza e chama funções com sys_refcursor...Só dar uma procurada, faz pouco tempo isto!!
[]'s
Responder
  • Informação
  • Quem está online

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