SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
Unidade 2
  Linguagem Procedural -
Stored Procedures - Triggers



                           1
Unidade 2
Linguagem Procedural - Procedures - Triggers

  Linguagem Procedural para Manipulação
  de BD Relacional – PL/SQL
  Stored Procedures
  Stored Functions
  Triggers
  Exercícios


                                               2
PL/SQL
• PL/SQL

       É uma ferramenta manipulação de dados do Oracle que pode
  ser usada internamente (dentro do próprio Oracle) ou externamente
  (nos aplicativos) de diversas maneiras.

• Tópicos de PL/SQL

      - Trata-se de uma linguagem procedural (Procedural
  Language/SQL) associada ao SQL.

       - Associa as vantagens das linguagens de Terceira Geração
  (Linguagens Procedurais como a linguagem C) com as de Quarta
  Geração como o SQL.

        - É uma linguagem estruturada bastante poderosa e de fácil
  interação com a Base de Dados.
                                                                3
Sintaxe e Estrutura
• Sintaxe e Estrutura de PL/SQL

       - Todos os scripts PL/SQL são compostos de comandos
  procedurais ou comandos SQL.

      - Blocos procedurais incluem declarações de variáveis,
  chamada de procedimentos e construção de loops.

       - Comandos SQL são usados para acessar a base de dados.

       - A unidade básica de qualquer programa PL/SQL é chamada
  de bloco.




                                                               4
BLOCOS PL/SQL
• Estrutura Básica de um Bloco PL/SQL


       DECLARE
            Seção de Declaração onde estão declarados:
                   - Variáveis PL/SQL
                   - Cursores
                   - Subprogramas Locais

       BEGIN
                Contém o conjunto de comandos que formam a seção
  executável.

       EXCEPTION
                Área que contém os comandos de identificação de
  erros e tratamento dos mesmos

       END;                                                   5
BLOCOS PL/SQL
• NOTAS:

       - Somente a Área executável é essencial. As demais são
  opcionais.

      - O uso da Área de DECLARE é válida somente na
  composição de triggers que serão vistos mais adiante.

       - Nos Procedimentos, Funções e Packages palavra DECLARE
  é substituída por AS ou IS.

       - A área de Exception é utilizada para responder em tempo real
  aos erros ocorridos na interação com a base de dados.




                                                                6
Identificadores PL/SQL
• Identificadores

      São usados para nomear objetos como variáveis, cursores e
  subprogramas.

• Regras
      - No máximo pode ser composto por 30 caracteres.
      - Não podem possuir espaços em branco.
      - Devem iniciar sempre com uma letra.
      - Caracteres especiais não podem ser usados.




                                                             7
Declaração de Variáveis
• Variáveis e Tipos

      - As informações são transmitidas entre o PLSQL e a Base de
  Dados através de variáveis.

        - Uma variável é uma área de memória alocada que pode ser
  lida pelo programa.

       - Toda variável possui um tipo associado a ela.

      - O tipo de variável definirá a gama de informações que ela
  poderá armazenar.

  Sintaxe de Declaração

  nome_da_variável tipo [CONSTANT] [NOT NULL] [DEFAULT] [:=valor]


                                                                    8
Declaração de Variáveis
• Exemplos:

       DECLARE
        v_curso1 NUMBER NOT NULL;
        v_curso2 NUMBER NOT NULL := 1;
        v_curso3 NUMBER DEFAULT :=1;


• Tipos de Variáveis PL/SQL

       - Os tipos de variáveis existentes no PL/SQL são semelhantes
  aos existentes no ORACLE na declaração das colunas das Tabelas.

       - Existem algumas diferenças que podem causar problemas na
  hora da programação.

      - O PL/SQL permite a declaração de variáveis a partir dos
  campos existentes numa tabela.                                  9
Declaração de Variáveis
• Number
     Igual ao tipo NUMBER da Base de Dados.
     Sintaxe:
             NUMBER (P,S)
     ,onde P é a precisão e S a escala.

• Varchar2
      Semelhante ao tipo na Base de Dados, porém seu tamanho
  máximo é de 32767 bytes. No SQL é de 2000 bytes.

• Char
      Semelhante ao tipo na Base de Dados, porém seu tamanho
  máximo é de 32767 bytes. No SQL é de 255 bytes.

• Long
      Semelhante ao tipo na Base de Dados, porém seu tamanho
  máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes
  dependendo da versão.                                      10
Declaração de Variáveis
• Raw
      Semelhante ao tipo na Base de Dados, porém seu tamanho
  máximo é de 32767 bytes. No SQL é de 255 bytes.

• Long Raw
      Semelhante ao tipo na Base de Dados, porém seu tamanho
  máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes
  dependendo da versão.

• Date

• Boolean
      Pode assumir como valores TRUE ou FALSE



                                                            11
Declaração de Variáveis
• Usando o Comando %TYPE
       Define que a variável é do tipo do campo de uma tabela. É usado
  quando uma variável recebe a informação de uma tabela. Assim o tipo
  de variável será idêntica ao da coluna da tabela. Caso haja uma
  mudança na tabela, não será necessário mudar o programa.

       Exemplo:
       DECLARE
       v_SetorCod curso01.setor.SetorCod%TYPE




                                                                 12
Escopo e Visibilidade de Variáveis
  • Escopo de uma Variável
         Escopo de uma variável é a porção do programa na qual uma
    variável pode ser acessada.
         A figura a seguir ilustra o escopo de uma variável

               DECLARE
               v_Number NUMBER (3);




      {
               BEGIN


V_Number
               DECLARE
                 v_String VARCHAR2(10);
               BEGIN
               ...
                                                        }  V_String


               END;
               END;



  • Temos indicado o escopo das variáveis v_Number e v_string. O
    escopo é sempre finalizado por um END que termina o bloco básico.
                                                                 13
Escopo e Visibilidade de Variáveis
• Visibilidade de uma Variável
       É a porção do programa onde a variável pode ser acessada de forma
  única sem ser sobreposta por outra variável de mesmo nome.
                      DECLARE
                      v_Number NUMBER (3);
                      v_String VARCHAR2 (40);
                      BEGIN
                      (1)
                      DECLARE
                       v_String VARCHAR2(10);
                      BEGIN
                      (2)
                      ...
                      END;
                      (3)
                      END;
• A variável v_Number é visível e esta dentro do escopo em todo o programa
  (nas regiões 1, 2 e 3). Já a variável v_String varchar(40) está dentro do
  escopo nas regiões 1, 2 e 3, porém só é visível na região 1 e 3. Na região 2
  passa a existir a variável v_String varchar2(10).                     14
Conversão Entre Tipos de Dados
• Conversão entre tipos de dados
        É possível convertermos todos os tipos de dados sem
  restrições. A não ser pelas restrições de tamanho de dados. Não
  pode-se, por exemplo, converter um CHAR(10) em um
  VARCHAR(5).
        Existem basicamente dois tipos de conversão:
  a implícita e a explícita.

• Conversão Implícita
      PL/SQL automaticamente, realiza a conversão entre tipos de
  dados diferentes quando isso é possível.




                                                               15
Exemplo
•      Exemplo:
             DECLARE
                   V_String VARCHAR2(5);
             BEGIN
                   SELECT campo_number
                   INTO V_string
                   FROM nome_da_tabela
                   WHERE codigo=1;
             END;

• Conversão Explícita
      Será vista adiante com as funções de conversão de dados.




                                                                 16
Estruturas de Controle
• Estruturas de controle são as mais importantes extensões
  de SQL do PL/SQL.
• Permite processar dados utilizado comando condicionais,
  iterativos e com controle de fluxo.
   –   IF ... THEN ... ELSE ...
   –   FOR ... LOOP
   –   WHILE ... LOOP
   –   EXIT WHEN




                                                         17
Controle Condicional
                        IF ... THEN ...
• Forma mais simples de desvio condicional.
   IF Condição THEN
        seqüência de comandos;
    ELSE
        seqüência de comandos;
   END IF;

• Exemplo 1:
IF salario < 1000 THEN
    UPDATE funcionario SET salario = salario * 1,20;
ELSE
    UPDATE funcionario SET salario = salario * 1,10;
END IF;

• Forma mais simplificada:
IF x > y THEN maior := x; END IF;                      18
IF-THEN-ELSIF
• Desvio condicional para selecionar alternativas mutuamente exclusivas.
IF condição1 THEN
   seqüência de comandos 1;
ELSIF condição2 THEN
   seqüência de comandos 2;
ELSE
   seqüência de comandos 3;
END IF;
• Exemplo:
BEGIN
 ...
 IF vendas > 50000 THEN
     bonus := 1500;
 ELSIF vendas > 35000 THEN
     bonus := 500;
 ELSE
     bonus := 100;
 END IF;
 INSERT INTO pagamento VALUES (matricula, bonus, ...);
END;                                                              19
Controle Interativo
LOOP
 -- sequência de comandos
END LOOP;

Executa um laço infinito.

Ex.:

LOOP
 ...
 IF Qtde_Produto > 10 THEN
     ...
    EXIT; -- abandona o laço *
 END IF;
END LOOP;


* Este comando pode ser utilizado somente para abandonar um laço
                                                               20
EXIT WHEN
• Este comando permite abandonar um laço se um processamento for
  impossível ou indesejável.
• Quando se encontra o comando EXIT a cláusula WHEN é avaliada.
• Se o resultado for verdadeiro o laço é abandonado.

Exemplo:

LOOP
 ...
 total := total + salario;
 EXIT WHEN total > 25000; -- sai do laço se esta
                             -- condição for satisfeita
END LOOP;




                                                            21
WHILE ... LOOP
• Associa uma condição com um seqüência de comandos. Antes de
  cada iteração do laço a condição é avaliada.

• Se a condição resultar em verdadeiro o conjunto de comandos do laço
  é executado e novamente avaliada a condição.

• Se a condição for FALSA ou NULA o laço é ignorado e o controle
  passa para o próximo comando.

• No exemplo a seguir, pode-se encontrar o primeiro empregado que
  possui um salário maior que 4000 e possui posição superior de
  comando que o empregado 7902.




                                                                   22
WHILE ... LOOP
                                 Exemplo
DECLARE
 salario         emp.sal%TYPE;
 matricula       emp.mat%TYPE;
 nome           emp.nome%TYPE;
 mat_inicial CONSTANT NUMBER(4) := 7902;
BEGIN
 SELECT sal, mat
                INTO salario, matricula
                FROM emp
                WHERE matricula = mat_inicial;
 WHILE salario < 4000 LOOP
     SELECT sal, mat, nome
                INTO salario, matricula, nome
         FROM emp WHERE mat = matricula;
 END LOOP;
 INSERT INTO historico VALUES
                 (NULL, salario, nome);
 COMMIT;
END;                                             23
Laço FOR
FOR counter IN [REVERSE] min..máx LOOP
 comandos;
END LOOP;
Dentro de um laço FOR, o valor do contador pode ser utilizado para as
operações necessárias mas não pode receber atribuições.

FOR ctr IN 1..10 LOOP
 ...
 IF NOT finished THEN
    INSERT INTO ... VALUES (ctr, ...); -- certo
    factor := ctr * 2; -- certo
 ELSE
   ctr := 10; -- ERRADO
 END IF;
END LOOP;
                                                                   24
CURSORES - PL/SQL
• O Oracle usa áreas de trabalho para executar comandos SQL e
  armazenar a informação processada.
• Um cursor é uma área de trabalho nomeada.
• Cursor implícito declara uma área de trabalho para todos os comandos
  SQL de manipulação de dados, inclusive para as consultas que
  retornam somente uma linha.
• Para consultas que retornam mais de uma linha, pode-se
  explicitamente declarar um cursor para processar cada linha
  individualmente.

DECLARE
 CURSOR c1 IS
  SELECT mat, nome, cargo FROM emp
   WHERE nu_depto = 20;

                                                                 25
Manipulando Cursores
• Um programa PL/SQL abre um cursor, processa as linhas resultantes
  de uma consulta e finalmente o fecha.
• Como um ponteiro de arquivo, um cursor marca a posição corrente
  em um arquivo aberto.
• O comando OPEN executa a consulta associada a um cursor,
  identifica o resultado e posiciona o ponteiro para o primeiro registro.
• O comando FETCH retorna o registro corrente e avança o ponteiro
  para o próximo registro.
• Quando o último registro for processando, o comando CLOSE
  desabilita o cursor.




                                                                    26
Abrindo uma Variável Cursor

• OPEN-FOR associa uma variável cursor com uma
  consulta.
OPEN (cursor_variable_name ) FOR select_statement;
  Ex.
IF NOT emp_cv%ISOPEN THEN
  /* Abre uma variável cursor */
  OPEN emp_cv FOR SELECT * FROM emp;
END IF;


• Atributos que possuem uma variável do tipo cursor.
%FOUND,
%NOTFOUND
%ISOPEN
%ROWCOUNT
• Para abrir a mesma variável para uma outra consulta deve-
                                                              27
  se primeiro fechar a variável.
Percorrendo uma Variável Cursor
• O comando FETCH retorna uma linha de cada vez e atualiza o
  ponteiro para o próximo registro.

FETCH (cursor_variable_name)
 INTO (variable_name[, variable_name]... | record_name);

LOOP
 /* Percorrendo o cursor */
 FETCH emp_cv INTO emp_rec;
 -- Abandona o laço no último registro da consulta.
 EXIT WHEN emp_cv%NOTFOUND;
 ....
END LOOP;
• Para cada coluna da variável cursor deve existir uma variável
  compatível correspondente na cláusula INTO.
• O número de colunas deve ser igual ao número de variáveis.      28
Fechando uma Variável Cursor
• O comando CLOSE desabilita a variável.

CLOSE ( cursor_variable_name );

LOOP
   FETCH emp_cv INTO emp_rec;
   EXIT WHEN emp_cv%NOTFOUND;
   ...
END LOOP;
/* Fechando a variável */
CLOSE emp_cv;




                                           29
Programas PL/SQL
• Objetos de Blocos PL/SQL

  - Um Bloco PL/SQL pode ser criado como um objeto
  ORACLE.

  - Sendo o bloco PL/SQL um objeto, ele estará
  armazenado na Base de Dados e poderá ser chamado
  por outros programas.

  - Os Blocos PL/SQL podem ser criados como
  procedures, funções, packages e triggers.




                                                 30
Procedures
• Procedimentos

      - Procedimentos e funções PLSQL podem ser definidos como
  subprogramas se compararmos com as linguagens de terceira geração.

      - Quando um procedimento é criado, este fica armazenado na
  Base de Dados na sua forma executável, para que possa ser usado,
  eventualmente, por outro bloco PL/SQL.

       - Quando um procedimento é chamado pode receber parâmetros
  do bloco PL/SQL que o chamou.

       - Um procedimento não pode ser chamado como parte de uma
  expressão. Quando um procedimento é chamado o controle passa a
  primeira linha de comando executável do mesmo. Ele retornará ao
  bloco PLSQL de origem ao terminar sua execução.

                                                               31
Procedures
• Sintaxe.
  CREATE [OR REPLACE] PROCEDURE procedure_name
  [(argument [{IN | OUT | IN OUT}] type,
   ...
    argument [{IN | OUT | IN OUT}] type)] {IS | AS}
   procedure body

• Cláusulas
      procedure_name - nome do procedimento a ser criado.

       or replace - se já existir um procedimento com esse nome este
  será derrubado para que o novo procedimento possa ser criado. Caso
  seja omitida esta cláusula o Oracle não permitirá a criação do
  procedimento se o se ele já existir com o mesmo nome.

      argument - São os parâmetros de entrada e saída que podem ser
  usados pelo procedimento.

                                                                32
Procedures
• Exemplo:
  CREATE OR REPLACE PROCEDURE PcInsereSetor
  (p_SetorCodNr   IN Setor.SetorCodNr%TYPE,
   p_SetorNomeVc  IN Setor.SetorNomeVc%TYPE)
  AS
  BEGIN

   INSERT INTO Setor (SetorCodNr ,SetorNomeVc)
   VALUES
   (p_SetorCodNr ,p_SetorNomeVc);
   COMMIT;
  END;

  O procedimento acima pode ser executado da seguinte maneira:

      BEGIN
              PcInsereSetor( ‘3’, ‘Departamento de Vendas’);
      END;
      ou,
      SQL> EXEC PcInsereSetor( ‘3’, ‘Departamento de Vendas’);
                                                                 33
Procedures
• Argumentos do Procedimento
  Os argumentos de um procedimento podem ser classificados como
  parâmetros de entrada, saída ou entrada e saída.

       Exemplo:
        CREATE OR REPLACE PROCEDURE PcTesteParametros
       ( p_InParametro    IN number,
         p_OutParametro   OUT number,
         p_InOutParametro IN OUT number) AS
       BEGIN
       ...
       END;

• Argumentos do Tipo IN

        O parâmetro é recebido pelo procedimento dentro do argumento
  do tipo IN. Este parâmetro não poderá ser modificado, pois ele pode ser
  usado apenas para a leitura.

                                                                   34
Procedures
• Argumentos do Tipo OUT

       Qualquer valor passado na chamada do procedimento para
  argumentos do tipo OUT é ignorado. Este parâmetro é somente de
  escrita, ou seja, não é possível atribuir valor a outras variáveis a partir
  deste parâmetro. Quando o procedimento termina, este retorna ao
  bloco PL/SQL que o chamou atualizando a variável do bloco com o
  valor passado pelo procedimento.


• Argumentos do Tipo IN OUT

        Como o próprio nome diz é uma combinação dos argumentos do
  tipo IN, OUT, ou seja, o parâmetro recebido servirá para escrita ou
  leitura. Ao retornar ao bloco PL/SQL que o chamou, atualiza a variável
  do bloco com o valor passado pelo procedimento.

                                                                         35
Procedures
• Exemplos:
       CREATE OR REPLACE PROCEDURE PcTesteParametros
      ( p_InParametro IN number,
        p_OutParametro OUT number,
        p_InOutParametro IN OUT number) AS
      v_VariávelLocal NUMBER;
      BEGIN
      v_VariávelLocal := p_InParametro;    --Legal
      p_InParametro := 7;                  -- Ilegal
      v_VariávelLocal := p_OutParametro;   -- Ilegal
      p_OutParametro := 7;                 -- Legal
      v_VariávelLocal := p_InOutParametro; -- Legal
      p_InOutParametro := 7;               -- Legal
      END;




                                                       36
Notas
        - Parâmetros IN sempre do lado esquerdo
   - Parâmetros OUT sempre do lado direito
   - Parâmetros IN OUT e OUT deverão sempre ter uma variável
correspondente no bloco PL/SQL que chamou o procedimento.
   Exemplo:
  DECLARE
  v_variavel1 NUMBER;
  v_variavel2 NUMBER;
  BEGIN
  PcTesteParametros(3, v_variavel1, v_variavel2);
  END;




                                                               37
Procedures

• Restrições nos Argumentos dos Procedimentos.

      Na declaração dos argumentos não podemos especificar o
  tamanho dos parâmetros.
      Exemplo:
      CREATE OR REPLACE PROCEDURE PcTesteParametros
      ( p_InParametro IN NUMBER (12), -- Ilegal
        p_OutParametro OUT NUMBER) ...




                                                               38
Procedures

• O tamanho do parâmetro de entrada é referenciado com o tamanho da
  variável correspondente no bloco PL/SQL que chamou o procedimento.
       Exemplo:
       CREATE OR REPLACE PROCEDURE PcTesteParametros
       ( p_InParametro IN OUT VARCHAR2) AS
       BEGIN
       ...
       END;


  Executando o procedimento:

       DECLARE                                    p_InParametro será um
             v_variavel1 VARCHAR2(10);            VACHAR2 (10)
       BEGIN
             PcTesteParametros(v_variavel1);
       END;

                                                                39
Funções
• Funções

       - Funções são muito similares a procedimentos.

       - Possuem os mesmos tipos de argumentos e restrições.

       - Uma função deve retornar um valor


• Sintaxe.

  CREATE [OR REPLACE] FUNCTION function_name
  [(argument [{IN}] type,
   ...
    argument [{IN}] type)]
   RETURN return_type {IS | AS}
   function_body
                                                               40
Funções
• Cláusulas

      function_name - nome da função a ser criada.

       OR REPLACE - se já existir uma função com esse nome esta
  será derrubada para que a nova função possa ser criada.

      argument e type - similares aos dos procedimentos

       RETURN - O tipo do valor que a função irá retornar. Dentro do
  corpo da função, o comando RETURN é usado para retornar o
  controle para o bloco PL/SQL que chamou a função.




                                                               41
Exemplo
CREATE OR REPLACE FUNCTION RetornaCodigo RETURN NUMBER
AS
  v_FuncCod NUMBER;
  BEGIN
  SELECT sequencia.NEXTVAL into v_FuncCod from DUAL
  RETURN v_FuncCod;
  END;




                                                   42
Funções
CREATE OR REPLACE FUNCTION RetornaTipoSalario (p_FuncCod IN
NUMBER)        RETURN VARCHAR2
  AS
  v_FuncSalario NUMBER;
  BEGIN

   SELECT FuncSalarioNr INTO v_FuncSalario FROM Funcionario WHERE
FuncCodNr = p_FuncCod ;

   IF v_FuncSalario <= 100 THEN
        RETURN ‘Salário Muito Baixo’;

   ELSIF v_FuncSalario <= 500 THEN
       RETURN ‘Salário Baixo’;

   ELSIF v_FuncSalario <= 1000 THEN
       RETURN ‘Salário um Pouco Baixo’;
   ELSE
       RETURN ‘Salário Razoável’;
   END IF;

END RetornaTipoSalario;
                                                              43
Triggers
• Triggers (Gatilhos)
  - Triggers são similares a procedimentos, onde possuem áreas de
  declaração, execução e tratamento de erros.
  - Procedimentos são executados explicitamente por outro bloco. Um
  trigger é executado implicitamente sempre que um evento de
  disparo ocorre.
  - Os eventos de disparo que podem chamar um trigger são:
  INSERT, UPDATE ou DELETE

• Uso de Triggers
  - Para elaborar restrições de integridade complexas impossíveis de
  serem geradas na criação das tabelas.
  - Para registrar informações diversas sobre modificações de tabelas.
  - Para sinalizar outros programas sobre as modificações ocorridas.



                                                                44
Triggers
• Sintaxe

       CREATE OR REPLACE TRIGGER trigger_name
       {BEFORE | AFTER} triggering_event ON nome_tabela
       [FOR EACH ROW [WHEN trigger_condition]]
       trigger_body;

• Cláusulas

       trigger_name - nome do trigger.

       triggering_event - especifica quando o trigger será disparado.

       nome_tabela - nome da tabela na qual será usado o gatilho.

        trigger_condition - se estiver presente será validada primeiro.
  O trigger só é executado se a condição retornar TRUE.
                                                                  45
Triggers
• Exemplo: Um trigger que garante que o nome do funcionário e
  o seu endereço sempre serão inseridos em letras maiúsculas.

  CREATE TRIGGER trgcurso
  BEFORE
  INSERT OR UPDATE
  ON funcionario
  FOR EACH ROW
  BEGIN
  :new.FuncNome:=upper(:new. FuncNome);

  :new.FuncEnder:=upper(:new. FuncEnder);

  END;

                                                         46
Triggers

                 Cláusula BEFORE/AFTER

• São cláusulas obrigatórias que especificam quando deve
  ser disparado o gatilho.
• Deve ser declarado antes do corpo do código.
• No exemplo anterior, o código do gatilho deve ser disparado
  antes das operações especificadas.




                                                        47
Triggers
     Comandos de gatilho: DELETE, INSERT e UPDATE.

• Um, dois ou todos os três comandos podem ser incluídos na
  especificação do gatilho.
• Deve ser definida uma única tabela associada com um gatilho. Não
  pode ser uma visão (VIEW).
• Para o exemplo anterior, qualquer um dos comandos abaixo ativará o
  gatilho.
DELETE FROM funcionario;
INSERT INTO funcionario VALUES ( . . . );
INSERT INTO funcionario SELECT . . . FROM . . . ;
UPDATE funcionario SET . . . ;
• Se um gatilho especifica a atualização de uma lista de colunas, então o
    gatilho será disparado somente se alguma coluna desta lista for
    alterada.
... BEFORE DELETE OR INSERT OR UPDATE OF funcnome ON funcionario ...


                                                                  48
Triggers
                   Cláusula FOR EACH ROW
• Determina se o gatilho é de linha ou um gatilho de comando.
• Se for especificado FOR EACH ROW, o gatilho é ativado sempre para
  cada linha da tabela que é afetada pela definição do gatilho.
• A ausência desta cláusula significa que um gatilho é ativado somente
  uma vez para cada comando aplicável, mas não separadamente para
  linha afetada pelo comando.

CREATE TRIGGER log_salary_increase
AFTER UPDATE ON emp
FOR EACH ROW
WHEN (:new.sal > 1000)
BEGIN
  INSERT INTO emp_log (emp_id, log_date, new_salary, action)
    VALUES (:new.empno, SYSDATE, :new.sal, 'NEW SAL');
END;
                                                                49
Exemplo
Com o comando abaixo:
•    UPDATE emp SET sal = sal + 1000.0
    WHERE deptno = 20;


• Se existirem 5 funcionários no departamento 20, o gatilho será
  disparado 5 vezes, pois 5 linhas serão afetadas.

• O gatilho abaixo será disparado uma única vez, para cada atualização
  na tabela EMP.

CREATE TRIGGER log_emp_update
AFTER UPDATE ON emp
BEGIN
  INSERT INTO emp_log (log_date, action)
    VALUES (SYSDATE, 'EMP COMMISSIONS CHANGED');
END;
                                                                   50
Triggers
                     Cláusula: WHEN
• Pode-se definir um gatilho restrito a uma definição
  especificada para uma expressão booleana SQL na
  cláusula WHEN.
• Quando definida esta cláusula, a expressão é avaliada
  para cada linha afetada pelo gatilho.

• Se a expressão retornar VERDADEIRA (true) para uma
  linha, o gatilho será ativado para a linha.

• Se a expressão retornar FALSA (false) ou Não
  VERDADEIRA (null) para a linha, o gatilho não será
  ativado para a linha
                                                          51
Triggers
                          Corpo do Gatilho
• O corpo do gatilho é um bloco PL/SQL que pode conter comandos
  SQL e/ou PL/SQL.
• Serão executados sempre que os comandos forem disparados e as
  restrições, desde que especificadas, forem satisfeitas.
• Para gatilhos de linha existem alguns predicados especiais.
                 INSERTING, DELETING e UPDATING.
• No corpo de um gatilho de linha, o comando PL/SQL pode acessar os
  valores novos e antigos do registro corrente afetados pelo gatilho.
• Duas palavras chaves são utilizadas para cada coluna que esta sendo
  modificada.
OLD para o valor antigo
NEW para o novo valor
• Dependendo do tipo de comando de gatilho, certos nomes não tem
  significado.
                                                                52
Triggers
• Um gatilho ativado com um comando INSERT pode acessar somente a
  coluna NEW, pois não existe valor antigo.
• Um gatilho para o comando UPDATE pode acessar o valor NEW e OLD
  tanto para a cláusula BEFORE e AFTER de cada linha.
• Um gatilho ativado com um comando DELETE pode acessar somente a
  coluna.
• Ex.
IF :new.sal > 10000 . . .
IF :new.sal < :old.sal . . .


• O valor NEW pode ser mudado quando utilizado com a cláusula
  BEFORE.
• Se uma cláusula BEFORE muda o valor de NEW.COLUNA um gatilho
  associado à cláusula AFTER é disparado no mesmo comando. 53
Exercícios
1) Criar as tabelas:   Funcionario
                       Matricula     Numérico 5 dígitos Chave primária
                       Nome          Varchar2 30 dígitos
                       DataNasc      Date
                       DataAdm       Date
                       Salario       Numérico 8 dígitos
                                     inteiros e 2 dígitos
                                     decimais

                       Relatório
                       Relcodnr      Numérico 8 dígitos   Chave primária
                       Matricula     Numérico 5 dígitos   Chave estrangeira da
                                                          tabela Funcionário
                                                          (Matricula)
                       Reldescrvc Caracter 100 dígitos
                       Relobsvc   Caracter 50 dígitos
                       Reldatadt data




                                                                                 54
Exercícios
2) Crie um procedimento que acrescente 30% ao salário de todos os
funcionários que foram admitidos após 01-01-2007.



3) Crie um procedimento que recebe a matrícula do funcionário e retorne
o nome e o seu respectivo salário. Faça um programa chamador para
este procedimento.




                                                                    55
Exercícios
4) Crie uma função onde o parâmetro de entrada é o código do
funcionário, e que retorne como parâmetro (de saída) as seguintes
mensagens:

   mensagens                         condição
   Tem salário menor que $200        Funcionário nessa faixa salarial
   Tem salário maior que $300        Funcionário nessa faixa salarial
   Tem salário entre $200 e $300     Funcionário nessa faixa salarial




                                                                        56
Exercícios
5) Crie uma função onde o parâmetro de entrada é o código do funcionário, e
que retorne como parâmetro (de saída) as seguintes mensagens:
      mensagens                    condição
      Tem menos de 20 anos         Funcionário com menos de 20 anos
      Tem mais de 40 anos          Funcionário com mais de 40 anos
      Tem entre 20 e 40 anos       Funcionários entre 20 e 40 anos

6) Crie um procedimento (usando as funções anteriores) e que insira os
seguintes dados na tabela relatório:

             Relcodnr           Numérico sequencial
             Matricula          Código do funcionário
             Reldescrvc         O funcionário “nome_do_funcionário”
                                “mensagem_1” e “mensagem_2”
             Reldatadt          Data do sistema


Onde:
mensagem_1= mensagem retornada pela função do exercício 2
mensagem_2=mensagem retornada pela função do exercício 3
                                                                      57
Exercícios

7) Crie um procedimento que seja ativado automaticamente quando uma
operação de delete ocorrer na tabela Funcionario. Esse procedimento
deverá registrar em uma tabela Hist_Funcionario o usuário que está
executando a operação e a data.




                                                               58

Contenu connexe

Tendances (20)

Aula de C e C++
Aula de C e C++Aula de C e C++
Aula de C e C++
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQL
 
Introdução a Banco de Dados (Parte 2)
Introdução a Banco de Dados (Parte 2)Introdução a Banco de Dados (Parte 2)
Introdução a Banco de Dados (Parte 2)
 
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)
 
Algoritmo e Complexidade - texto Aula1.docx
Algoritmo e Complexidade - texto Aula1.docxAlgoritmo e Complexidade - texto Aula1.docx
Algoritmo e Complexidade - texto Aula1.docx
 
2832014 curso plsql
2832014 curso plsql2832014 curso plsql
2832014 curso plsql
 
Apostila c++
Apostila c++Apostila c++
Apostila c++
 
Boas práticas de programação em C# .NET
Boas práticas de programação em C# .NETBoas práticas de programação em C# .NET
Boas práticas de programação em C# .NET
 
Agbd aula4 sql_ddl
Agbd aula4 sql_ddlAgbd aula4 sql_ddl
Agbd aula4 sql_ddl
 
Exercícios PL/SQL
Exercícios PL/SQLExercícios PL/SQL
Exercícios PL/SQL
 
Aula01
Aula01Aula01
Aula01
 
Algorítmo estruturado
Algorítmo estruturadoAlgorítmo estruturado
Algorítmo estruturado
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Java3
Java3Java3
Java3
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
 
Java4
Java4Java4
Java4
 
Introdução a Linguagem de Programação C
Introdução a Linguagem de Programação CIntrodução a Linguagem de Programação C
Introdução a Linguagem de Programação C
 
Alg aula 08 - modularizacao
Alg   aula 08 - modularizacaoAlg   aula 08 - modularizacao
Alg aula 08 - modularizacao
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
 
Aula 4 | Funções
Aula 4 | Funções Aula 4 | Funções
Aula 4 | Funções
 

En vedette

UNIFAL - MySQL Stored Routines - 5.0/5.6
UNIFAL - MySQL Stored Routines - 5.0/5.6UNIFAL - MySQL Stored Routines - 5.0/5.6
UNIFAL - MySQL Stored Routines - 5.0/5.6Wagner Bianchi
 
UNIFAL - MySQL Triggers - 5.0/5.6
UNIFAL - MySQL Triggers - 5.0/5.6UNIFAL - MySQL Triggers - 5.0/5.6
UNIFAL - MySQL Triggers - 5.0/5.6Wagner Bianchi
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggersflaviognm
 
Utilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersUtilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersDaniel Maia
 
MySQL Multi-Source Replication for PL2016
MySQL Multi-Source Replication for PL2016MySQL Multi-Source Replication for PL2016
MySQL Multi-Source Replication for PL2016Wagner Bianchi
 

En vedette (7)

Triggers no SQL Server
Triggers no SQL ServerTriggers no SQL Server
Triggers no SQL Server
 
UNIFAL - MySQL Stored Routines - 5.0/5.6
UNIFAL - MySQL Stored Routines - 5.0/5.6UNIFAL - MySQL Stored Routines - 5.0/5.6
UNIFAL - MySQL Stored Routines - 5.0/5.6
 
UNIFAL - MySQL Triggers - 5.0/5.6
UNIFAL - MySQL Triggers - 5.0/5.6UNIFAL - MySQL Triggers - 5.0/5.6
UNIFAL - MySQL Triggers - 5.0/5.6
 
Aprofundamento de DDL e DML
Aprofundamento de DDL e DMLAprofundamento de DDL e DML
Aprofundamento de DDL e DML
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggers
 
Utilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersUtilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggers
 
MySQL Multi-Source Replication for PL2016
MySQL Multi-Source Replication for PL2016MySQL Multi-Source Replication for PL2016
MySQL Multi-Source Replication for PL2016
 

Similaire à Unidade 2 - Linguagem Procedural PL/SQL

Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Natanael Fonseca
 
Linguagem c-para-microcontroladores
Linguagem c-para-microcontroladoresLinguagem c-para-microcontroladores
Linguagem c-para-microcontroladores34macchia34
 
Apostila sql
Apostila sqlApostila sql
Apostila sqlsnetobr
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdfQuitriaSilva550
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6Wagner Bianchi
 
ICC - Aula 15 - Ambiente Pascal e Suas Estruturas
ICC - Aula 15 - Ambiente Pascal e Suas EstruturasICC - Aula 15 - Ambiente Pascal e Suas Estruturas
ICC - Aula 15 - Ambiente Pascal e Suas EstruturasFelipe J. R. Vieira
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01Gilson Figueredo
 
Processo de Desenvolvimento de Software - Linguagens Imperativas x Declarativas
Processo de Desenvolvimento de Software - Linguagens Imperativas x DeclarativasProcesso de Desenvolvimento de Software - Linguagens Imperativas x Declarativas
Processo de Desenvolvimento de Software - Linguagens Imperativas x DeclarativasNatanael Simões
 
Algoritmos e Visualg parte 1
Algoritmos e Visualg   parte 1Algoritmos e Visualg   parte 1
Algoritmos e Visualg parte 1Marcio Pinto
 
Introdução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoIntrodução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoJessica Ribeiro
 

Similaire à Unidade 2 - Linguagem Procedural PL/SQL (20)

Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
plsql oracle
plsql oracleplsql oracle
plsql oracle
 
Linguagem c-para-microcontroladores
Linguagem c-para-microcontroladoresLinguagem c-para-microcontroladores
Linguagem c-para-microcontroladores
 
C pic
C picC pic
C pic
 
Apostila sql
Apostila sqlApostila sql
Apostila sql
 
Apostila sql
Apostila sqlApostila sql
Apostila sql
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
 
Manual robotec
Manual robotecManual robotec
Manual robotec
 
ICC - Aula 15 - Ambiente Pascal e Suas Estruturas
ICC - Aula 15 - Ambiente Pascal e Suas EstruturasICC - Aula 15 - Ambiente Pascal e Suas Estruturas
ICC - Aula 15 - Ambiente Pascal e Suas Estruturas
 
Java2
Java2Java2
Java2
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01
 
Introdução ao SQL
Introdução ao SQLIntrodução ao SQL
Introdução ao SQL
 
Cap05
Cap05Cap05
Cap05
 
Cap05
Cap05Cap05
Cap05
 
Cap05
Cap05Cap05
Cap05
 
Processo de Desenvolvimento de Software - Linguagens Imperativas x Declarativas
Processo de Desenvolvimento de Software - Linguagens Imperativas x DeclarativasProcesso de Desenvolvimento de Software - Linguagens Imperativas x Declarativas
Processo de Desenvolvimento de Software - Linguagens Imperativas x Declarativas
 
Algoritmos e Visualg parte 1
Algoritmos e Visualg   parte 1Algoritmos e Visualg   parte 1
Algoritmos e Visualg parte 1
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Introdução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoIntrodução a Linguagem de Programação
Introdução a Linguagem de Programação
 

Unidade 2 - Linguagem Procedural PL/SQL

  • 1. Unidade 2 Linguagem Procedural - Stored Procedures - Triggers 1
  • 2. Unidade 2 Linguagem Procedural - Procedures - Triggers Linguagem Procedural para Manipulação de BD Relacional – PL/SQL Stored Procedures Stored Functions Triggers Exercícios 2
  • 3. PL/SQL • PL/SQL É uma ferramenta manipulação de dados do Oracle que pode ser usada internamente (dentro do próprio Oracle) ou externamente (nos aplicativos) de diversas maneiras. • Tópicos de PL/SQL - Trata-se de uma linguagem procedural (Procedural Language/SQL) associada ao SQL. - Associa as vantagens das linguagens de Terceira Geração (Linguagens Procedurais como a linguagem C) com as de Quarta Geração como o SQL. - É uma linguagem estruturada bastante poderosa e de fácil interação com a Base de Dados. 3
  • 4. Sintaxe e Estrutura • Sintaxe e Estrutura de PL/SQL - Todos os scripts PL/SQL são compostos de comandos procedurais ou comandos SQL. - Blocos procedurais incluem declarações de variáveis, chamada de procedimentos e construção de loops. - Comandos SQL são usados para acessar a base de dados. - A unidade básica de qualquer programa PL/SQL é chamada de bloco. 4
  • 5. BLOCOS PL/SQL • Estrutura Básica de um Bloco PL/SQL DECLARE Seção de Declaração onde estão declarados: - Variáveis PL/SQL - Cursores - Subprogramas Locais BEGIN Contém o conjunto de comandos que formam a seção executável. EXCEPTION Área que contém os comandos de identificação de erros e tratamento dos mesmos END; 5
  • 6. BLOCOS PL/SQL • NOTAS: - Somente a Área executável é essencial. As demais são opcionais. - O uso da Área de DECLARE é válida somente na composição de triggers que serão vistos mais adiante. - Nos Procedimentos, Funções e Packages palavra DECLARE é substituída por AS ou IS. - A área de Exception é utilizada para responder em tempo real aos erros ocorridos na interação com a base de dados. 6
  • 7. Identificadores PL/SQL • Identificadores São usados para nomear objetos como variáveis, cursores e subprogramas. • Regras - No máximo pode ser composto por 30 caracteres. - Não podem possuir espaços em branco. - Devem iniciar sempre com uma letra. - Caracteres especiais não podem ser usados. 7
  • 8. Declaração de Variáveis • Variáveis e Tipos - As informações são transmitidas entre o PLSQL e a Base de Dados através de variáveis. - Uma variável é uma área de memória alocada que pode ser lida pelo programa. - Toda variável possui um tipo associado a ela. - O tipo de variável definirá a gama de informações que ela poderá armazenar. Sintaxe de Declaração nome_da_variável tipo [CONSTANT] [NOT NULL] [DEFAULT] [:=valor] 8
  • 9. Declaração de Variáveis • Exemplos: DECLARE v_curso1 NUMBER NOT NULL; v_curso2 NUMBER NOT NULL := 1; v_curso3 NUMBER DEFAULT :=1; • Tipos de Variáveis PL/SQL - Os tipos de variáveis existentes no PL/SQL são semelhantes aos existentes no ORACLE na declaração das colunas das Tabelas. - Existem algumas diferenças que podem causar problemas na hora da programação. - O PL/SQL permite a declaração de variáveis a partir dos campos existentes numa tabela. 9
  • 10. Declaração de Variáveis • Number Igual ao tipo NUMBER da Base de Dados. Sintaxe: NUMBER (P,S) ,onde P é a precisão e S a escala. • Varchar2 Semelhante ao tipo na Base de Dados, porém seu tamanho máximo é de 32767 bytes. No SQL é de 2000 bytes. • Char Semelhante ao tipo na Base de Dados, porém seu tamanho máximo é de 32767 bytes. No SQL é de 255 bytes. • Long Semelhante ao tipo na Base de Dados, porém seu tamanho máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes dependendo da versão. 10
  • 11. Declaração de Variáveis • Raw Semelhante ao tipo na Base de Dados, porém seu tamanho máximo é de 32767 bytes. No SQL é de 255 bytes. • Long Raw Semelhante ao tipo na Base de Dados, porém seu tamanho máximo é de 32767 bytes. No SQL é de 2G bytes ou 65535 bytes dependendo da versão. • Date • Boolean Pode assumir como valores TRUE ou FALSE 11
  • 12. Declaração de Variáveis • Usando o Comando %TYPE Define que a variável é do tipo do campo de uma tabela. É usado quando uma variável recebe a informação de uma tabela. Assim o tipo de variável será idêntica ao da coluna da tabela. Caso haja uma mudança na tabela, não será necessário mudar o programa. Exemplo: DECLARE v_SetorCod curso01.setor.SetorCod%TYPE 12
  • 13. Escopo e Visibilidade de Variáveis • Escopo de uma Variável Escopo de uma variável é a porção do programa na qual uma variável pode ser acessada. A figura a seguir ilustra o escopo de uma variável DECLARE v_Number NUMBER (3); { BEGIN V_Number DECLARE v_String VARCHAR2(10); BEGIN ... } V_String END; END; • Temos indicado o escopo das variáveis v_Number e v_string. O escopo é sempre finalizado por um END que termina o bloco básico. 13
  • 14. Escopo e Visibilidade de Variáveis • Visibilidade de uma Variável É a porção do programa onde a variável pode ser acessada de forma única sem ser sobreposta por outra variável de mesmo nome. DECLARE v_Number NUMBER (3); v_String VARCHAR2 (40); BEGIN (1) DECLARE v_String VARCHAR2(10); BEGIN (2) ... END; (3) END; • A variável v_Number é visível e esta dentro do escopo em todo o programa (nas regiões 1, 2 e 3). Já a variável v_String varchar(40) está dentro do escopo nas regiões 1, 2 e 3, porém só é visível na região 1 e 3. Na região 2 passa a existir a variável v_String varchar2(10). 14
  • 15. Conversão Entre Tipos de Dados • Conversão entre tipos de dados É possível convertermos todos os tipos de dados sem restrições. A não ser pelas restrições de tamanho de dados. Não pode-se, por exemplo, converter um CHAR(10) em um VARCHAR(5). Existem basicamente dois tipos de conversão: a implícita e a explícita. • Conversão Implícita PL/SQL automaticamente, realiza a conversão entre tipos de dados diferentes quando isso é possível. 15
  • 16. Exemplo • Exemplo: DECLARE V_String VARCHAR2(5); BEGIN SELECT campo_number INTO V_string FROM nome_da_tabela WHERE codigo=1; END; • Conversão Explícita Será vista adiante com as funções de conversão de dados. 16
  • 17. Estruturas de Controle • Estruturas de controle são as mais importantes extensões de SQL do PL/SQL. • Permite processar dados utilizado comando condicionais, iterativos e com controle de fluxo. – IF ... THEN ... ELSE ... – FOR ... LOOP – WHILE ... LOOP – EXIT WHEN 17
  • 18. Controle Condicional IF ... THEN ... • Forma mais simples de desvio condicional. IF Condição THEN seqüência de comandos; ELSE seqüência de comandos; END IF; • Exemplo 1: IF salario < 1000 THEN UPDATE funcionario SET salario = salario * 1,20; ELSE UPDATE funcionario SET salario = salario * 1,10; END IF; • Forma mais simplificada: IF x > y THEN maior := x; END IF; 18
  • 19. IF-THEN-ELSIF • Desvio condicional para selecionar alternativas mutuamente exclusivas. IF condição1 THEN seqüência de comandos 1; ELSIF condição2 THEN seqüência de comandos 2; ELSE seqüência de comandos 3; END IF; • Exemplo: BEGIN ... IF vendas > 50000 THEN bonus := 1500; ELSIF vendas > 35000 THEN bonus := 500; ELSE bonus := 100; END IF; INSERT INTO pagamento VALUES (matricula, bonus, ...); END; 19
  • 20. Controle Interativo LOOP -- sequência de comandos END LOOP; Executa um laço infinito. Ex.: LOOP ... IF Qtde_Produto > 10 THEN ... EXIT; -- abandona o laço * END IF; END LOOP; * Este comando pode ser utilizado somente para abandonar um laço 20
  • 21. EXIT WHEN • Este comando permite abandonar um laço se um processamento for impossível ou indesejável. • Quando se encontra o comando EXIT a cláusula WHEN é avaliada. • Se o resultado for verdadeiro o laço é abandonado. Exemplo: LOOP ... total := total + salario; EXIT WHEN total > 25000; -- sai do laço se esta -- condição for satisfeita END LOOP; 21
  • 22. WHILE ... LOOP • Associa uma condição com um seqüência de comandos. Antes de cada iteração do laço a condição é avaliada. • Se a condição resultar em verdadeiro o conjunto de comandos do laço é executado e novamente avaliada a condição. • Se a condição for FALSA ou NULA o laço é ignorado e o controle passa para o próximo comando. • No exemplo a seguir, pode-se encontrar o primeiro empregado que possui um salário maior que 4000 e possui posição superior de comando que o empregado 7902. 22
  • 23. WHILE ... LOOP Exemplo DECLARE salario emp.sal%TYPE; matricula emp.mat%TYPE; nome emp.nome%TYPE; mat_inicial CONSTANT NUMBER(4) := 7902; BEGIN SELECT sal, mat INTO salario, matricula FROM emp WHERE matricula = mat_inicial; WHILE salario < 4000 LOOP SELECT sal, mat, nome INTO salario, matricula, nome FROM emp WHERE mat = matricula; END LOOP; INSERT INTO historico VALUES (NULL, salario, nome); COMMIT; END; 23
  • 24. Laço FOR FOR counter IN [REVERSE] min..máx LOOP comandos; END LOOP; Dentro de um laço FOR, o valor do contador pode ser utilizado para as operações necessárias mas não pode receber atribuições. FOR ctr IN 1..10 LOOP ... IF NOT finished THEN INSERT INTO ... VALUES (ctr, ...); -- certo factor := ctr * 2; -- certo ELSE ctr := 10; -- ERRADO END IF; END LOOP; 24
  • 25. CURSORES - PL/SQL • O Oracle usa áreas de trabalho para executar comandos SQL e armazenar a informação processada. • Um cursor é uma área de trabalho nomeada. • Cursor implícito declara uma área de trabalho para todos os comandos SQL de manipulação de dados, inclusive para as consultas que retornam somente uma linha. • Para consultas que retornam mais de uma linha, pode-se explicitamente declarar um cursor para processar cada linha individualmente. DECLARE CURSOR c1 IS SELECT mat, nome, cargo FROM emp WHERE nu_depto = 20; 25
  • 26. Manipulando Cursores • Um programa PL/SQL abre um cursor, processa as linhas resultantes de uma consulta e finalmente o fecha. • Como um ponteiro de arquivo, um cursor marca a posição corrente em um arquivo aberto. • O comando OPEN executa a consulta associada a um cursor, identifica o resultado e posiciona o ponteiro para o primeiro registro. • O comando FETCH retorna o registro corrente e avança o ponteiro para o próximo registro. • Quando o último registro for processando, o comando CLOSE desabilita o cursor. 26
  • 27. Abrindo uma Variável Cursor • OPEN-FOR associa uma variável cursor com uma consulta. OPEN (cursor_variable_name ) FOR select_statement; Ex. IF NOT emp_cv%ISOPEN THEN /* Abre uma variável cursor */ OPEN emp_cv FOR SELECT * FROM emp; END IF; • Atributos que possuem uma variável do tipo cursor. %FOUND, %NOTFOUND %ISOPEN %ROWCOUNT • Para abrir a mesma variável para uma outra consulta deve- 27 se primeiro fechar a variável.
  • 28. Percorrendo uma Variável Cursor • O comando FETCH retorna uma linha de cada vez e atualiza o ponteiro para o próximo registro. FETCH (cursor_variable_name) INTO (variable_name[, variable_name]... | record_name); LOOP /* Percorrendo o cursor */ FETCH emp_cv INTO emp_rec; -- Abandona o laço no último registro da consulta. EXIT WHEN emp_cv%NOTFOUND; .... END LOOP; • Para cada coluna da variável cursor deve existir uma variável compatível correspondente na cláusula INTO. • O número de colunas deve ser igual ao número de variáveis. 28
  • 29. Fechando uma Variável Cursor • O comando CLOSE desabilita a variável. CLOSE ( cursor_variable_name ); LOOP FETCH emp_cv INTO emp_rec; EXIT WHEN emp_cv%NOTFOUND; ... END LOOP; /* Fechando a variável */ CLOSE emp_cv; 29
  • 30. Programas PL/SQL • Objetos de Blocos PL/SQL - Um Bloco PL/SQL pode ser criado como um objeto ORACLE. - Sendo o bloco PL/SQL um objeto, ele estará armazenado na Base de Dados e poderá ser chamado por outros programas. - Os Blocos PL/SQL podem ser criados como procedures, funções, packages e triggers. 30
  • 31. Procedures • Procedimentos - Procedimentos e funções PLSQL podem ser definidos como subprogramas se compararmos com as linguagens de terceira geração. - Quando um procedimento é criado, este fica armazenado na Base de Dados na sua forma executável, para que possa ser usado, eventualmente, por outro bloco PL/SQL. - Quando um procedimento é chamado pode receber parâmetros do bloco PL/SQL que o chamou. - Um procedimento não pode ser chamado como parte de uma expressão. Quando um procedimento é chamado o controle passa a primeira linha de comando executável do mesmo. Ele retornará ao bloco PLSQL de origem ao terminar sua execução. 31
  • 32. Procedures • Sintaxe. CREATE [OR REPLACE] PROCEDURE procedure_name [(argument [{IN | OUT | IN OUT}] type, ... argument [{IN | OUT | IN OUT}] type)] {IS | AS} procedure body • Cláusulas procedure_name - nome do procedimento a ser criado. or replace - se já existir um procedimento com esse nome este será derrubado para que o novo procedimento possa ser criado. Caso seja omitida esta cláusula o Oracle não permitirá a criação do procedimento se o se ele já existir com o mesmo nome. argument - São os parâmetros de entrada e saída que podem ser usados pelo procedimento. 32
  • 33. Procedures • Exemplo: CREATE OR REPLACE PROCEDURE PcInsereSetor (p_SetorCodNr IN Setor.SetorCodNr%TYPE, p_SetorNomeVc IN Setor.SetorNomeVc%TYPE) AS BEGIN INSERT INTO Setor (SetorCodNr ,SetorNomeVc) VALUES (p_SetorCodNr ,p_SetorNomeVc); COMMIT; END; O procedimento acima pode ser executado da seguinte maneira: BEGIN PcInsereSetor( ‘3’, ‘Departamento de Vendas’); END; ou, SQL> EXEC PcInsereSetor( ‘3’, ‘Departamento de Vendas’); 33
  • 34. Procedures • Argumentos do Procedimento Os argumentos de um procedimento podem ser classificados como parâmetros de entrada, saída ou entrada e saída. Exemplo: CREATE OR REPLACE PROCEDURE PcTesteParametros ( p_InParametro IN number, p_OutParametro OUT number, p_InOutParametro IN OUT number) AS BEGIN ... END; • Argumentos do Tipo IN O parâmetro é recebido pelo procedimento dentro do argumento do tipo IN. Este parâmetro não poderá ser modificado, pois ele pode ser usado apenas para a leitura. 34
  • 35. Procedures • Argumentos do Tipo OUT Qualquer valor passado na chamada do procedimento para argumentos do tipo OUT é ignorado. Este parâmetro é somente de escrita, ou seja, não é possível atribuir valor a outras variáveis a partir deste parâmetro. Quando o procedimento termina, este retorna ao bloco PL/SQL que o chamou atualizando a variável do bloco com o valor passado pelo procedimento. • Argumentos do Tipo IN OUT Como o próprio nome diz é uma combinação dos argumentos do tipo IN, OUT, ou seja, o parâmetro recebido servirá para escrita ou leitura. Ao retornar ao bloco PL/SQL que o chamou, atualiza a variável do bloco com o valor passado pelo procedimento. 35
  • 36. Procedures • Exemplos: CREATE OR REPLACE PROCEDURE PcTesteParametros ( p_InParametro IN number, p_OutParametro OUT number, p_InOutParametro IN OUT number) AS v_VariávelLocal NUMBER; BEGIN v_VariávelLocal := p_InParametro; --Legal p_InParametro := 7; -- Ilegal v_VariávelLocal := p_OutParametro; -- Ilegal p_OutParametro := 7; -- Legal v_VariávelLocal := p_InOutParametro; -- Legal p_InOutParametro := 7; -- Legal END; 36
  • 37. Notas - Parâmetros IN sempre do lado esquerdo - Parâmetros OUT sempre do lado direito - Parâmetros IN OUT e OUT deverão sempre ter uma variável correspondente no bloco PL/SQL que chamou o procedimento. Exemplo: DECLARE v_variavel1 NUMBER; v_variavel2 NUMBER; BEGIN PcTesteParametros(3, v_variavel1, v_variavel2); END; 37
  • 38. Procedures • Restrições nos Argumentos dos Procedimentos. Na declaração dos argumentos não podemos especificar o tamanho dos parâmetros. Exemplo: CREATE OR REPLACE PROCEDURE PcTesteParametros ( p_InParametro IN NUMBER (12), -- Ilegal p_OutParametro OUT NUMBER) ... 38
  • 39. Procedures • O tamanho do parâmetro de entrada é referenciado com o tamanho da variável correspondente no bloco PL/SQL que chamou o procedimento. Exemplo: CREATE OR REPLACE PROCEDURE PcTesteParametros ( p_InParametro IN OUT VARCHAR2) AS BEGIN ... END; Executando o procedimento: DECLARE p_InParametro será um v_variavel1 VARCHAR2(10); VACHAR2 (10) BEGIN PcTesteParametros(v_variavel1); END; 39
  • 40. Funções • Funções - Funções são muito similares a procedimentos. - Possuem os mesmos tipos de argumentos e restrições. - Uma função deve retornar um valor • Sintaxe. CREATE [OR REPLACE] FUNCTION function_name [(argument [{IN}] type, ... argument [{IN}] type)] RETURN return_type {IS | AS} function_body 40
  • 41. Funções • Cláusulas function_name - nome da função a ser criada. OR REPLACE - se já existir uma função com esse nome esta será derrubada para que a nova função possa ser criada. argument e type - similares aos dos procedimentos RETURN - O tipo do valor que a função irá retornar. Dentro do corpo da função, o comando RETURN é usado para retornar o controle para o bloco PL/SQL que chamou a função. 41
  • 42. Exemplo CREATE OR REPLACE FUNCTION RetornaCodigo RETURN NUMBER AS v_FuncCod NUMBER; BEGIN SELECT sequencia.NEXTVAL into v_FuncCod from DUAL RETURN v_FuncCod; END; 42
  • 43. Funções CREATE OR REPLACE FUNCTION RetornaTipoSalario (p_FuncCod IN NUMBER) RETURN VARCHAR2 AS v_FuncSalario NUMBER; BEGIN SELECT FuncSalarioNr INTO v_FuncSalario FROM Funcionario WHERE FuncCodNr = p_FuncCod ; IF v_FuncSalario <= 100 THEN RETURN ‘Salário Muito Baixo’; ELSIF v_FuncSalario <= 500 THEN RETURN ‘Salário Baixo’; ELSIF v_FuncSalario <= 1000 THEN RETURN ‘Salário um Pouco Baixo’; ELSE RETURN ‘Salário Razoável’; END IF; END RetornaTipoSalario; 43
  • 44. Triggers • Triggers (Gatilhos) - Triggers são similares a procedimentos, onde possuem áreas de declaração, execução e tratamento de erros. - Procedimentos são executados explicitamente por outro bloco. Um trigger é executado implicitamente sempre que um evento de disparo ocorre. - Os eventos de disparo que podem chamar um trigger são: INSERT, UPDATE ou DELETE • Uso de Triggers - Para elaborar restrições de integridade complexas impossíveis de serem geradas na criação das tabelas. - Para registrar informações diversas sobre modificações de tabelas. - Para sinalizar outros programas sobre as modificações ocorridas. 44
  • 45. Triggers • Sintaxe CREATE OR REPLACE TRIGGER trigger_name {BEFORE | AFTER} triggering_event ON nome_tabela [FOR EACH ROW [WHEN trigger_condition]] trigger_body; • Cláusulas trigger_name - nome do trigger. triggering_event - especifica quando o trigger será disparado. nome_tabela - nome da tabela na qual será usado o gatilho. trigger_condition - se estiver presente será validada primeiro. O trigger só é executado se a condição retornar TRUE. 45
  • 46. Triggers • Exemplo: Um trigger que garante que o nome do funcionário e o seu endereço sempre serão inseridos em letras maiúsculas. CREATE TRIGGER trgcurso BEFORE INSERT OR UPDATE ON funcionario FOR EACH ROW BEGIN :new.FuncNome:=upper(:new. FuncNome); :new.FuncEnder:=upper(:new. FuncEnder); END; 46
  • 47. Triggers Cláusula BEFORE/AFTER • São cláusulas obrigatórias que especificam quando deve ser disparado o gatilho. • Deve ser declarado antes do corpo do código. • No exemplo anterior, o código do gatilho deve ser disparado antes das operações especificadas. 47
  • 48. Triggers Comandos de gatilho: DELETE, INSERT e UPDATE. • Um, dois ou todos os três comandos podem ser incluídos na especificação do gatilho. • Deve ser definida uma única tabela associada com um gatilho. Não pode ser uma visão (VIEW). • Para o exemplo anterior, qualquer um dos comandos abaixo ativará o gatilho. DELETE FROM funcionario; INSERT INTO funcionario VALUES ( . . . ); INSERT INTO funcionario SELECT . . . FROM . . . ; UPDATE funcionario SET . . . ; • Se um gatilho especifica a atualização de uma lista de colunas, então o gatilho será disparado somente se alguma coluna desta lista for alterada. ... BEFORE DELETE OR INSERT OR UPDATE OF funcnome ON funcionario ... 48
  • 49. Triggers Cláusula FOR EACH ROW • Determina se o gatilho é de linha ou um gatilho de comando. • Se for especificado FOR EACH ROW, o gatilho é ativado sempre para cada linha da tabela que é afetada pela definição do gatilho. • A ausência desta cláusula significa que um gatilho é ativado somente uma vez para cada comando aplicável, mas não separadamente para linha afetada pelo comando. CREATE TRIGGER log_salary_increase AFTER UPDATE ON emp FOR EACH ROW WHEN (:new.sal > 1000) BEGIN INSERT INTO emp_log (emp_id, log_date, new_salary, action) VALUES (:new.empno, SYSDATE, :new.sal, 'NEW SAL'); END; 49
  • 50. Exemplo Com o comando abaixo: • UPDATE emp SET sal = sal + 1000.0 WHERE deptno = 20; • Se existirem 5 funcionários no departamento 20, o gatilho será disparado 5 vezes, pois 5 linhas serão afetadas. • O gatilho abaixo será disparado uma única vez, para cada atualização na tabela EMP. CREATE TRIGGER log_emp_update AFTER UPDATE ON emp BEGIN INSERT INTO emp_log (log_date, action) VALUES (SYSDATE, 'EMP COMMISSIONS CHANGED'); END; 50
  • 51. Triggers Cláusula: WHEN • Pode-se definir um gatilho restrito a uma definição especificada para uma expressão booleana SQL na cláusula WHEN. • Quando definida esta cláusula, a expressão é avaliada para cada linha afetada pelo gatilho. • Se a expressão retornar VERDADEIRA (true) para uma linha, o gatilho será ativado para a linha. • Se a expressão retornar FALSA (false) ou Não VERDADEIRA (null) para a linha, o gatilho não será ativado para a linha 51
  • 52. Triggers Corpo do Gatilho • O corpo do gatilho é um bloco PL/SQL que pode conter comandos SQL e/ou PL/SQL. • Serão executados sempre que os comandos forem disparados e as restrições, desde que especificadas, forem satisfeitas. • Para gatilhos de linha existem alguns predicados especiais. INSERTING, DELETING e UPDATING. • No corpo de um gatilho de linha, o comando PL/SQL pode acessar os valores novos e antigos do registro corrente afetados pelo gatilho. • Duas palavras chaves são utilizadas para cada coluna que esta sendo modificada. OLD para o valor antigo NEW para o novo valor • Dependendo do tipo de comando de gatilho, certos nomes não tem significado. 52
  • 53. Triggers • Um gatilho ativado com um comando INSERT pode acessar somente a coluna NEW, pois não existe valor antigo. • Um gatilho para o comando UPDATE pode acessar o valor NEW e OLD tanto para a cláusula BEFORE e AFTER de cada linha. • Um gatilho ativado com um comando DELETE pode acessar somente a coluna. • Ex. IF :new.sal > 10000 . . . IF :new.sal < :old.sal . . . • O valor NEW pode ser mudado quando utilizado com a cláusula BEFORE. • Se uma cláusula BEFORE muda o valor de NEW.COLUNA um gatilho associado à cláusula AFTER é disparado no mesmo comando. 53
  • 54. Exercícios 1) Criar as tabelas: Funcionario Matricula Numérico 5 dígitos Chave primária Nome Varchar2 30 dígitos DataNasc Date DataAdm Date Salario Numérico 8 dígitos inteiros e 2 dígitos decimais Relatório Relcodnr Numérico 8 dígitos Chave primária Matricula Numérico 5 dígitos Chave estrangeira da tabela Funcionário (Matricula) Reldescrvc Caracter 100 dígitos Relobsvc Caracter 50 dígitos Reldatadt data 54
  • 55. Exercícios 2) Crie um procedimento que acrescente 30% ao salário de todos os funcionários que foram admitidos após 01-01-2007. 3) Crie um procedimento que recebe a matrícula do funcionário e retorne o nome e o seu respectivo salário. Faça um programa chamador para este procedimento. 55
  • 56. Exercícios 4) Crie uma função onde o parâmetro de entrada é o código do funcionário, e que retorne como parâmetro (de saída) as seguintes mensagens: mensagens condição Tem salário menor que $200 Funcionário nessa faixa salarial Tem salário maior que $300 Funcionário nessa faixa salarial Tem salário entre $200 e $300 Funcionário nessa faixa salarial 56
  • 57. Exercícios 5) Crie uma função onde o parâmetro de entrada é o código do funcionário, e que retorne como parâmetro (de saída) as seguintes mensagens: mensagens condição Tem menos de 20 anos Funcionário com menos de 20 anos Tem mais de 40 anos Funcionário com mais de 40 anos Tem entre 20 e 40 anos Funcionários entre 20 e 40 anos 6) Crie um procedimento (usando as funções anteriores) e que insira os seguintes dados na tabela relatório: Relcodnr Numérico sequencial Matricula Código do funcionário Reldescrvc O funcionário “nome_do_funcionário” “mensagem_1” e “mensagem_2” Reldatadt Data do sistema Onde: mensagem_1= mensagem retornada pela função do exercício 2 mensagem_2=mensagem retornada pela função do exercício 3 57
  • 58. Exercícios 7) Crie um procedimento que seja ativado automaticamente quando uma operação de delete ocorrer na tabela Funcionario. Esse procedimento deverá registrar em uma tabela Hist_Funcionario o usuário que está executando a operação e a data. 58