pl sql treinar

33
1 ORACLE – PL/SQL ORACLE – PL/SQL ORACLE – PL/SQL

Upload: niva1509

Post on 23-Jun-2015

786 views

Category:

Documents


13 download

TRANSCRIPT

Page 1: PL SQL Treinar

1

ORACLE – PL/SQLORACLE – PL/SQL

ORACLE – PL/SQL

Page 2: PL SQL Treinar

2

ORACLE – PL/SQLORACLE – PL/SQL

Stored Procedures

Grupo de comandos SQL e PL/SQL que executam uma determinada tarefa. Uma stored procedure precisa ser chamada a partir de um programa ou ser executada manualmente pelo usuário.

Uma stored procedure é totalmente portátil dentro das plataformas nas quais o oracle é executado.

Page 3: PL SQL Treinar

3

ORACLE – PL/SQLORACLE – PL/SQL

Uma stored procedure pode ser executada através das seguintes formas:

1. Através de uma ferramenta oracle, como o SQL*PLUS

2. Através de uma chamada explícita no código de uma aplicação de banco de dados, como o oracle forms

3. Através de uma chamada explícita a partir de uma outra procedure ou trigger

Page 4: PL SQL Treinar

4

ORACLE – PL/SQLORACLE – PL/SQL

Uma stored procedure possui duas partes:

Seção de especificação

Corpo da procedure

Exemplo:

Page 5: PL SQL Treinar

5

ORACLE – PL/SQLORACLE – PL/SQL

CREATE OR REPLACE PROCEDURE aumenta_sal

(p_cod_fun number)

IS

BEGIN

UPDATE func

SET vl_sal = vl_sal * 1.10

WHERE cod_fun = p_cod_fun;

commit;

END aumenta_sal;

Page 6: PL SQL Treinar

6

ORACLE – PL/SQLORACLE – PL/SQL

Cursor

Quando o oracle processa um comando SQL, ele abre uma área de memória chamada Private SQL Area, que armazena informações responsáveis pela execução do comando. Um identificador para essa área – Chamado Cursor - é criado.

No SQL*Plus para selecionar registros do banco de dados, basta um comando SELECT para que as linhas das tabelas ou visualizações que satisfaçam os critérios especificados sejam exibidas na tela.

Page 7: PL SQL Treinar

7

ORACLE – PL/SQLORACLE – PL/SQL

Quando você usa o PL/SQL, um comando SELECT que retorna mais de uma linha, o oracle exibe uma mensagem de erro que invoca a exceção TOO_MANY_ROWS. Para resolver esse problema, o oracle usa um mecanismo chamado CURSOR.

Tipos de Cursor

Implícitos: O oracle declara implicitamente um cursor para todos os comandos DDL e DML que retornam apenas uma linha.

Page 8: PL SQL Treinar

8

ORACLE – PL/SQLORACLE – PL/SQL

Explícito: Para consultas que retornam múltiplas linhas e que são criados pelos usuários.

O conjunto de linhas retornadas por um cursor se chama result set (Conjunto de resultado). A linha que está sendo processada em um determinado momento é chamada current row(linha atual).

Um cursor identifica a linha atual dentro do result set e permite o processamento individual de cada uma delas.

Page 9: PL SQL Treinar

9

ORACLE – PL/SQLORACLE – PL/SQL

O oracle usa quatro comandos para definir, abrir, acessar linhas e fechar um cursor. São eles: DECLARE, OPEN, FETCH E CLOSE.

Um cursor pode ser visto como um arquivo temporário que armazena e controla as linhas retornadas por um comando SELECT.

O SQL*PLUS gera automaticamente cursores para as consultas executadas. Já o PL/SQL, é necessário que o usuário crie cursores explícitos.

Page 10: PL SQL Treinar

10

ORACLE – PL/SQLORACLE – PL/SQL

Criando um cursor

A criação de um cursor envolve quatro etapas:

1- Declaração do cursor. Nesta etapa, é criado um nome para o cursor e atribuído um comando SELECT a ele.

2- Abertura do cursor. Nessa etapa, a consulta é executada e é determinado o número de linhas que será retornado.

3- FETCHING. Na terceira etapa, as linhas encontradas são enviadas para o programa PL/SQL.

Page 11: PL SQL Treinar

11

ORACLE – PL/SQLORACLE – PL/SQL

4- Fechamento do cursor. A última etapa libera os recursos do oracle alocados para o cursor.

Exemplo Prático:

create or replace procedure niva is

c_nome_fun func.nome_fun%type;

c_cod_fun func.cod_fun%type;

c_vl_sal func.vl_sal%type;

Page 12: PL SQL Treinar

12

Baanco de Dados OracleBaanco de Dados Oracle

cursor teste1 is

select nome_fun, cod_fun, vl_sal from func where vl_sal between 500 and 900

order by vl_sal;

begin

dbms_output.enable;

open teste1;

loop

Page 13: PL SQL Treinar

13

ORACLE – PL/SQLORACLE – PL/SQL

fetch teste1 into c_nome_fun,c_cod_fun,c_vl_sal;

exit when teste1%notfound;

dbms_output.put_line (c_nome_fun || '-' || to_char(c_cod_fun) || '-' || to_char(c_vl_sal));

end loop;

close teste1;

end;

Page 14: PL SQL Treinar

14

ORACLE – PL/SQLORACLE – PL/SQL

TRIGGERS

São rotinas ou procedures que são utilizados quando um comando INSERT, UPDATE ou DELETE é executado em uma tabela ou até mesmo numa visão.

Um trigger é executado automaticamente sem a interferência do usuário.

A principal aplicação de um trigger é a criação de consistências e restrições de acesso ao banco de dados, assim como rotinas de segurança.

Page 15: PL SQL Treinar

15

ORACLE – PL/SQLORACLE – PL/SQL

Algumas Aplicações:

Criar o conteúdo de uma coluna derivada de outras colunas.

Criar mecanismos de validação que envolvam pesquisas em múltiplas tabelas.

Criar LOGS para registrar a utilização de uma tabela.

Atualizar outras tabelas em função de inclusão ou alteração da tabela atual.

Page 16: PL SQL Treinar

16

ORACLE – PL/SQLORACLE – PL/SQL

Um trigger pode executar comandos contidos em seu bloco ou acionar as stored procedures para executar determinadas tarefas.

Ele está associado a uma tabela, e em alguns casos, a uma visão. Quando uma visão é utilizada, os triggers da tabela base são normalmente acionados.

Se uma tarefa puder ser feita tanto com triggers como com constraints, use a constraint como primeira opção.

Page 17: PL SQL Treinar

17

ORACLE – PL/SQLORACLE – PL/SQL

Restrição de Uso

Uma trigger não pode executar comandos COMMIT, ROLLBACK ou SAVEPOINT, nem tampouco chamar procedures ou funções que executam essas tarefas.

O comando SELECT pode ser usado apenas com a cláusula INTO.

Um trigger do tipo row-level não pode ler ou modificar o conteúdo de uma tabela em mutação.

Page 18: PL SQL Treinar

18

ORACLE – PL/SQLORACLE – PL/SQL

Uma tabela mutante é aquela na qual seu conteúdo está sendo alterado por um comando INSERT, DELETE ou UPDATE e o comando não foi concluído, ou seja, ainda não foram gravados com COMMIT.

O tamanho do trigger, ou seja, o texto dos comandos, não pode exceder 32 Kb.

Page 19: PL SQL Treinar

19

ORACLE – PL/SQLORACLE – PL/SQL

Tipos de Trigger

1. Triggers de tabela aplicados aos comandos do tipo DML.

2. INSTEAD-OFF aplicados à visões.

3. SYSTEM EVENT aplicados no banco de dados nas operações de startup, shutdown e erro.

4. USER EVENT aplicado a um usuário ou objeto de esquema.

5. BEFORE e AFTER triggers.

Page 20: PL SQL Treinar

20

ORACLE – PL/SQLORACLE – PL/SQL

Componentes de um T rigger

Comando SQL que aciona o trigger

O disparo do trigger pode ser ocasionado pelo comando SQL ou por um evento do usuário.

Limitador de Ação do Trigger

Representado pela cláusula WHEN, especifica qual condição deve ser verdadeira para que o trigger seja disparado.

Page 21: PL SQL Treinar

21

ORACLE – PL/SQLORACLE – PL/SQL

Ação Executada pelo Trigger

É o bloco PL/SQL, Java ou rotina C que é executado pelo trigger.

Trigger de Tabela

Existem dois tipos distintos de triggers que podem ser usados em uma tabela. Um é executado apenas uma vez quando ocorre o evento de disparo e o outro é para cada linha da tabela processada pelo comando SQL.

Page 22: PL SQL Treinar

22

ORACLE – PL/SQLORACLE – PL/SQL

Statement-level Trigger

Esse trigger é disparado apenas uma vez.

Por exemplo: Se um comando UPDATE atualizar 15 linhas, os comandos contidos no trigger serão executados uma única vez, e não em cada linha processada.

Row-Level Trigger

Esse trigger tem os seus comandos executados para todas as linhas que sejam afetadas pelo comando que gerou o acionamento do trigger.

Page 23: PL SQL Treinar

23

ORACLE – PL/SQLORACLE – PL/SQL

Trigger do Tipo INSTEAD-OF

Oferecem uma maneira clara de alterar visões que não podem ser alteradas diretamente através de instruções SQL DML(INSERT, DELETE e UPDATE).

Trigger de Eventos de Sistema e Usuário

1. Eventos de Sistema – São disparados durante o startup ou shutdown do banco de dados e também por mensagens de erro. Podem ser:

Startup – Disparados quando o banco de dados abre uma instância.

Page 24: PL SQL Treinar

24

ORACLE – PL/SQLORACLE – PL/SQL

Shutdown – Disparados imediatamente antes do banco de dados iniciar o processo de shutdown.

Servererror – Disparados quando um erro específico ou um erro qualquer ocorre.

Os triggers de evento de usuário ocorrem quando o usuário faz seu logon, logoff ou executa comandos DML ou DDL.

LOGON – Dispara após a conexão do ussuário.

LOGOFF – Dispara quando o usuário inicia sua desconexão.

Page 25: PL SQL Treinar

25

ORACLE PL/SQLORACLE PL/SQL

Referências a Colunas

Dentro de um trigger do tipo row-level é possível acessar o valor de um campo de uma linha. Dependendo da operação que está sendo executada, é necessário preceder o nome da coluna com o sufixo :new ou :old.

Pois em um determinado instante pode-se obter tanto o valor antigo como o novo valor do campo.

Para um comando INSERT, os valores dos campos que serão gravados devem ser precedidos pelo sufixo new.

Page 26: PL SQL Treinar

26

ORACLE PL/SQLORACLE PL/SQL

Para um comando DELETE, os valores dos campos da linha que está processada devem ser precedidos pelo sufixo old.

Para um comando UPDATE, o valor original que está gravado é acessado com sufixo old. Os novos valores que serão gravados devem ser precedidos do sufixo new.

Os valores old e new estão disponíveis nos triggers do tipo BEFORE e AFTER.

Page 27: PL SQL Treinar

27

ORACLE PL/SQLORACLE PL/SQL

Exemplos:

CREATE OR REPLACE TRIGGER t_pedidos BEFORE INSERT ON pedidosDeclare

t_val char(30);BEGIN

t_val:= 'Parabéns Pelo Pedido'; dbms_output.enable; dbms_output.put_line(t_val); END;

Page 28: PL SQL Treinar

28

ORACLE PL/SQLORACLE PL/SQL

CREATE OR REPLACE TRIGGER t_reduz_sal BEFORE UPDATE OF vl_sal ON func FOR EACH ROW when (new.vl_sal < old.vl_sal * 0.75)BEGIN dbms_output.put_line('id = ' || :old.cod_fun); dbms_output.put_line('Old vl_sal = ' || :old.vl_sal); dbms_output.put_line('New vl_sal = ' || :new.vl_sal); dbms_output.put_line('A redução salarial é maior 25%'); INSERT INTO auditoria ( cod_fun, vl_sal_a, vl_sal_b) VALUES ( :old.cod_fun, :old.vl_sal, :new.vl_sal ); END ;

Page 29: PL SQL Treinar

29

ORACLE PL/SQLORACLE PL/SQL

PACKAGES

Um package é uma coleção de objetos de banco de dados, como stored procedures, funções, variáveis, constantes e cursores. Ele contém subprogramas que podem ser chamados a partir de um trigger, uma procedure ou uma função. É um aliado do desenvolvedor, pois permite organizar melhor os componentes de um sistema em módulos.

Page 30: PL SQL Treinar

30

ORACLE PL/SQLORACLE PL/SQL

Além disso, a administração de privilégios é facilitada. Um package também melhora o desempenho da máquina, já que ele transfere para a memória diversos objetos de uma só vez.

Um package possui duas seções:

Especificação – Funciona como uma espécie de sumário do conteúdo do corpo do package. Nessa seção, são declarados os nomes de funções e stored procedures juntamente com os nomes de variáveis e constantes, incluindo nesse último sua inicialização.

Page 31: PL SQL Treinar

31

ORACLE PL/SQLORACLE PL/SQL

A seção de especificação é criada com o comando CREATE PACKAGE.

Corpo – Nesta seção são declarados os objetos que farão parte do package e é criada com o comando CREATE PACKAGE BODY

Exemplo:

create package pk_teste isprocedure aumenta_sal (p_cod_fun number);function f_func(f_vl_sal func.vl_sal%type) return number; end;

Page 32: PL SQL Treinar

32

ORACLE PL/SQLORACLE PL/SQL

create or replace package body pk_teste is PROCEDURE aumenta_sal(p_cod_fun number)IS

BEGIN

UPDATE funcSET vl_sal = vl_sal * 1.10WHERE cod_fun = p_cod_fun;commit;END aumenta_sal;

Page 33: PL SQL Treinar

33

ORACLE PL/SQLORACLE PL/SQL

function f_func (f_vl_sal func.vl_sal%type) return number is tot_ped number; begin select count(*) into tot_ped from func where vl_sal = f_vl_sal; return tot_ped; end; end;