Pular para o conteúdo

Fóruns SQL e PL/SQL Ajuda perguntas pl/sql Responder a: Ajuda perguntas pl/sql

#149137
Avatar photoJosé Laurindo Chiappa
Moderador

    Blz ? Então, com CERTEZA eu não posso nem vou responder por você o Exercício todo (até porque isso seria NOCIVO para o seu Aprendizado), mas vou dar umas dicas, mostrar um “esqueleto”, a forma BÁSICA dos códigos que vc vai ter que escrever…

    pergunta 1, criar uma procedure : vou assumir aqui que o ID da pessoa é numérico, E assumirei que esse ID é a Chave da tabela PESSOA que vai ser alterada, então ALÉM de perguntar pela coluna STATUS, vou filtrar o UPDATE pela coluna ID também… Ficaria tipo :

    CREATE OR REPLACE PROCEDURE PRC_ATUALIZA (P_ID number) is
    BEGIN
       UPDATE PESSOA SET DELETED_ON = SYSDATE where ID = P_ID and STATUS = 'INATIVO';
    END;
    

    —> REPITO, isso que escrevei acima NÂO É o código pronto, completo e Apresentável, é só um Esqueleto, um esboço, mas tá relativamente PRÓXIMO, ok ?? Dá uma olhada nele E veja aí o que vc não entendeu nele ou coisa do tipo, qquer coisa pergunta…

    pergunta 2, para que serve a trigger : presumo que a sua resposta foi esse trecho de ‘Esse gatilho serve para obter informações da linha que esta sento inserida na tabela, podendo ser atualizada.’ , não é só isso : REALMENTE uma trigger de FOR EACH ROW automaticamente VAI obter os valores da linha sofrendo INSERT/UPDATE/DELETE, ok, MAS faltou dizzer que a trigger pega essa valor E grava na tabela PESSOA_LOG, provavelmente pra fins de Auditoria.

    pergunta 3, criar view : o ESBOÇO que vou escrever abaixo é BEM BEM mais longe da resposta final necessária (pois a solicitação completa é Muito Longa, pra fazer a coisa completa com certeza eu demoraria mais do que os 2 ou 3 minutos que gasto pra dar uma resposta), mas de modo geral vai ser algo tipo :

    CREATE OR REPLACE VIEW V_ENDERECOS_PESSOA as 
     SELECT P.ID as ID_PESSOA, P.NOME_PESSOA, E.ENDERECO, E.TIPO -- faltam todas as OUTRAS colunas....
       FROM PESSOA P,  ENDERECOS E
      WHERE P.ID  = E.ID_PESSOA; 

    —> Observações Importantes : no ‘exemplo’ acima eu usei sintaxe não-ANSI para o JOIN (SE teu professor faz questão, vc Recodifique isso pra usar ANSI join) , NÃO coloquei TODAs as colunas pedidas (já que isto é só Rascunho), E, como vc não dá os NOMEs das colunas reais Nem a modelagem, eu coloquei como chaves pro JOIN da ENDERECOS com a PESSOA só a coluna ID, que na tabela PESSOA eu supus ser ID mesmo só o nome da coluna E na tabela ENDERECOS achei que a coluna se chama ID_PESSOA, pra não confundir com a coluna ID do Endereço….

    pergunta 4, criar bloco PL/SQL que identifica PESSOAS sem endereco E as insere na tabela ENDERECO : como ele pede BLOCO PL/SQL, vou codificar isso num BLOCO PL/SQL ANÔNIMO, não vou usar nem procedure nem package pra isso… Ficaria tipo :

    DECLARE
       v_code number;
       v_errm varchar2(255);
    BEGIN
       for r in (SELECT ID as ID_PESSOA, ID_ENDERECO, ... TODAS as outras colunas da ENDERECO ....
                   FROM PESSOA P
                  WHERE NOT EXISTS  (select 1 FROM ENDERECO WHERE ID_PESSOA  = P.ID
                 )
       loop
          Begin
             insert into  ENDERECO (ID, ENDERECO, CIDADE, outracoluna....) VALUES (valordoID, 'AV. REPÚBLICA DO CHILE, 230', 'RIO DE JANEIRO', ... outros valores....);
          Exception
             when OTHERS then
                v_code := SQLCODE;
                v_errm := SUBSTR(SQLERRM, 1 , 64);
                DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
                INSERT INTO errors VALUES (v_code, v_errm, SYSTIMESTAMP);                    
          End;   
       end loop;
       commit;
    END;
    

    —> IMPORTANTE : além de reforçar o caráter de Exemplo Não Pronto pra rodar, como vc Não Disse Exatamente O QUE deve ser feito com os erros, eu Suponho que deve ser feito o arroz com feijão, ie : mostrar a msg e código E guardar numa tabela de log de erros, que teria sido já criada antes….

    Abraços,

    Chiappa