Oracle 10g: SQL e PL/SQL



Documentos relacionados
Oracle PL/SQL Overview

Bancos de Dados I. Integridade semântica

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

Sistemas de Informação

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas


SQL Procedural. Josino Rodrigues Neto

SQL Gatilhos (Triggers)

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Logado no OracleXE vamos acessar a opção:

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

Triggers no PostgreSQL

PL/pgSQL por Diversão e Lucro

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

PL/pgSQL. Introdução. Introdução. Introdução

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

António Rocha Nuno Melo e Castro

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

Gatilhos (Triggers) Prof. Márcio Bueno Elaborado por Maria Lígia B. Perkusich

INTRODUÇÃO AO PL/SQL

Banco de Dados Avançados Banco de Dados Ativo

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

MANUAL INSTALAÇÃO WEB SERVICE

Comandos de Manipulação

Monitoria GDI Aula Prática. DML + PL/SQL parte 1

Integridade dos Dados


Linguagem PL/SQL e Triggers

PROCEDIMENTOS ARMAZENADOS (Stored Procedures)

trigger insert, delete, update

Introdução ao SQL. Aécio Costa

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

Bases de Dados 2007/2008. Aula 9

Oracle 10g Dicas de PL/SQL. Conteúdo

A linguagem SQL

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

Projeto de Banco de Dados

Funções Definidas pelo Usuário

Tarefa Orientada 19 Triggers

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Consultoria e Treinamento em Bancos de Dados Relacionais

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Prof. Josenildo Silva

SQL Server Triggers Aprenda a utilizar triggers em views e auditar as colunas atualizadas em uma tabela

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Bases de Dados 2007/2008. Aula 8

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

PostgreSQL. André Luiz Fortunato da Silva Analista de Sistemas CIRP / USP alf@cirp.usp.br

FERRAMENTA DE APOIO A REESTRUTURAÇÃO DE CÓDIGO FONTE EM LINGUAGEM PL/SQL BASEADO EM PADRÕES DE LEGIBILIDADE

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

BD II (SI 587) Procedimentos Armazenados

Controle de transações em SQL

poder de manipulação de dados do SQL com poder de processamento das lp procedimentais

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

SQL DDL Criando Tabelas e Restrições

Auditoria de sistemas Deixe que seu banco de dados faça o trabalho por você

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

Apostila do Minicurso de PL/SQL. François Oliveira

CIÊNCIA E TECNOLOGIA DO RIO

Introdução ao PL/SQL

Hugo Pedro Proença, 2007

Banco de Dados II. PL/SQL - Procedures -Cursor - Funções. Segurança: Introdução; Controle de Acesso; Criptografia; Recursos de SQL.

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Programação WEB II. PHP e Banco de Dados. progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

SQL (Structured Query Language)

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.

São 182 videoaulas de Oracle pl/sql procedures functions triggers Forms Reports

Banco de Dados. Prof. Antonio

PROCEDURES, FUNÇÕES, PL/SQL, CURSORES, VIEW, ÍNDICE e SEQUÊNCIA. Stored procedure PL/SQL. Procedimentos e Funções. Procedimento (procedure) Procedure

estiver abaixo ou igual ao mínimo, um novo pedido é acrescentado a uma relação pedidos.

BANCO DE DADOS BANCO DE DADOS. Prof. Patrícia Lucas 3º Trimestre

2. Criar um bloco PL/SQL anônimo para imprimir as tabuadas abaixo: 5 X 10 = 50 5 X 2 = X 10 = X 2 = 2...

f. Exemplo: verificar condição de aprovação de alunos

Programando em SQL. Triggers, Stored Procedures e funções. Profa. Késsia Marchi

O dono de uma livraria cuja base de dados é administrada por si pediu-lhe para efectuar as seguintes alterações ao preço dos livros:

Transações Seguras em Bancos de Dados (MySQL)

UNISA Universidade de Santo Amaro. Material de Estudo. Módulo I: Básico Banco de dados SQL Server.

Programação SQL. Introdução

SQL TGD/JMB 1. Projecto de Bases de Dados. Linguagem SQL

SQL Pacotes. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados Pacotes

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

Transcrição:

Oracle 10g: SQL e PL/SQL PL/SQL: Visão Geral Enzo Seraphim

Visão Geral Vantagens de PL/SQL Suporte total à linguagem SQL Total integração com o Oracle Performance Redução da comunicação entre a aplicação e o banco de dados Manutenibilidade Um procedimento armazenado no banco de dados pode ser usado com segurança por várias aplicações 2

Visão Geral PL/SQL é uma linguagem estruturada 3

Visão Geral Variáveis: Tipos SQL: varchar, date, number, etc. Tipos PL/SQL: boolean, binary_integer Atribuição: Direta: tax := price * tax_rate Comando DML: SELECT sal * 0.10 INTO bonus FROM emp 4

Visão Geral Cursores: Área para executar sentenças SQL e armazenar informações de processamento Implícitos o PL/SQL aloca um cursor para todas as consultas Explícitos para consultas que retornam mais que 1 registro, pode-se declarar um cursor para manipular registro a registro 5

Visão Geral Cursores: 6

Visão Geral Atributos: Variáveis e cursores PL/SQL tem atributos %TYPE: fornece o tipo de dados de uma variável ou coluna de uma tabela. Útil ao declarar variáveis que armazenarão valores de uma tabela. %ROWTYPE: fornece um registro que representa uma linha de uma tabela. 7

Estruturas de Controle IF-THEN-ELSE IF condição THEN sentenças ELSEIF condição THEN sentenças ELSE sentenças END IF; 8

Estruturas de Controle CASE CASE variável WHEN valor THEN sentenças; WHEN valor THEN sentenças; ELSE sentenças; END CASE; 9

Estruturas de Controle LOOP LOOP sentenças; IF condição THEN EXIT; END IF; END LOOP; 10

Estruturas de Controle WHILE-LOOP WHILE condição LOOP sentenças; END LOOP; 11

Estruturas de Controle FOR-LOOP FOR contador IN [REVERSE] de..até LOOP sentenças; END LOOP; Exemplo: FOR i IN REVERSE 1..3 LOOP atribui os valores 3,2,1 para i sentenças; END LOOP; 12

Comentários De uma linha: -- comentário bonus := nota * 0.15; -- cálculo De qualquer tamanho: /* calcular um bônus de 15% nas notas dos bons alunos */ 13

Operadores e precedência Operador ** *, / +, -, =, <, >, <=, >=, <>,!=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN not And Or Operação Exponencial Multiplicação, divisão Adição, subtração, concatenação comparação Negação lógica Conjunção Disjunção 14

Oracle 10g: SQL e PL/SQL Procedures e functions Enzo Seraphim

Create procedure 16

Create procedure Sintaxe CREATE [OR REPLACE] PROCEDURE proc_name [(param[, param]...)] {IS AS} [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [proc_name]; 17

Create procedure Parâmetros param [IN OUT IN OUT] tipo In: somente entrada Out: somente saída In Out: entrada e saída 18

Create procedure /* Criando um procedimento que calcula a área */ CREATE OR REPLACE PROCEDURE calcular_area (largura in number, compr in number, area out number) AS BEGIN area := largura * compr; END calcular_area; / 19

Create procedure /* Declarando uma variável no ambiente para receber o resultado */ VARIABLE RESULTADO NUMBER; /* Executando o procedimento no SQLPLUS */ EXECUTE calcular_area(6,7,:resultado); /* Verificando o resultado */ PRINT :RESULTADO; 20

Create function Sintaxe CREATE [OR REPLACE] FUNCTION func_name [(param[, param]...)] RETURN datatype {IS AS} [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [func_name]; Exercício: Criar uma função que retorna a área e executá-la 21

Create function /* Criando uma função que calcula a área */ CREATE OR REPLACE FUNCTION encontrar_area (largura in number, compr in number) RETURN NUMBER IS area number; BEGIN area := largura * compr; return area; END encontrar_area; / 22

Create function /* usando a função em uma consulta */ select encontrar_area(8,9) from dual; /* executando a função com um execute */ VARIABLE RESULTADO NUMBER; EXECUTE :RESULTADO := encontrar_area(8,9); PRINT :RESULTADO; 23

Cursores Cursores explícitos são usados para manipular consultas que retornam mais de 1 registro em blocos PL/SQL Comandos: OPEN: inicializa o cursor FETCH: pode-se executar FETCH até que todos os registros sejam acessados CLOSE: libera o cursor 24

Cursores: Sintaxe Sintaxe: CURSOR cursor_name [(parametros)] [RETURN return_type] IS select_statement; 25

Cursores: Declaração Exemplos: DECLARE CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal > 2000; CURSOR c2 RETURN dept%rowtype IS SELECT * FROM dept WHERE deptno = 10; 26

Cursores : Open Abrindo um cursor: DECLARE CURSOR c1 IS SELECT ename, job FROM emp WHERE sal < 3000;... BEGIN OPEN c1;... END; 27

Cursores: Open Abrindo um cursor com parâmetro: DECLARE CURSOR c1 (name VARCHAR2, salary NUMBER) IS SELECT...... OPEN c1(emp_name, 3000); OPEN c1(emp_name, salary); 28

Cursores: Fetch Após aberto o cursor, pegar o próximo registro Para cada atributo resultante do cursor, deverá ser passado uma variável: FETCH c1 INTO my_empno, my_ename, my_deptno; 29

Cursores: Fetch Para processar todos os registros, pode ser usado um LOOP, tendo como condição de parada a propriedade do cursor %NOTFOUND: LOOP FETCH c1 INTO my_record; EXIT WHEN c1%notfound; END LOOP; 30

Cursores: Atributos %FOUND teste se um FETCH encontrou um registro LOOP FETCH c1 INTO my_ename, my_sal, my_hiredate; IF c1%found THEN -- fetch succeeded... ELSE -- fetch failed, so exit loop EXIT; END IF; END LOOP; 31

Cursores: Atributos %NOTFOUND oposto do %FOUND. Retorna FALSE se o último FETCH retornou um registro LOOP FETCH c1 INTO my_ename, my_sal, my_hiredate; EXIT WHEN c1%notfound;... END LOOP; 32

Cursores: Atributos %ISOPEN testa se o cursor foi aberto IF c1%isopen THEN... ELSE OPEN c1; END IF; 33

Cursores: Atributos %ROWCOUNT conta quantos registros foram processados até o presente FETCH. LOOP FETCH c1 INTO my_ename, my_deptno; IF c1%rowcount > 10 THEN... END IF;... END LOOP; 34

Exemplo Orçamento cod_orçamento cliente email nota_fiscal data_orçamento data_notafiscal valor_total 1 contém N ItensOrçamento é N 1 Produto cod_orçamento cod_produto quantidade valor_unitário cod_produto descrição valor_unitário quantidade_estoque 35

Exemplo Modelo Relacional orcamento = {cod_orcamento, cliente, email, notafiscal, data_orcamento, data_nota_fiscal} itensorcamento = { cod_orcamento (orcamento.cod_orcamento), cod_produto (produto.cod_produto), valor_unitario, quantidade} produto = {cod_produto, descricao, valor_unitario, quantidade_estoque} 36

Exemplo Modelo Relacional create table orcamento ( cod_orcamento number, cliente varchar2(20), email varchar2(30), nota_fiscal char default 'N', data_orcamento date, data_notafiscal date, valor_total number(10,2) default 0.0, primary key(cod_orcamento) ); create table produto ( cod_produto number, descricao varchar2(20), valor_unitario number(10,2), quantidade_estoque number, primary key(cod_produto) ); create table itensorcamento( cod_orcamento number, cod_produto number, valor_unitario number(10,2), quantidade number, primary key (cod_orcamento, cod_produto), foreign key (cod_orcamento) references orcamento, foreign key (cod_produto) references produto ); 37

Cursores Exercício: escrever um procedimento chamado PROC_VALOR_ORCAMENTO que calcula o total de um orçamento e altera o atributo valor_total da tabela orçamento. Usar um cursor para percorrer ITENS_ORCAMENTO acumulando em uma variável o valor total (isso poderia ser feito com um simples SELECT) o procedimento deve ter como parâmetro de entrada o número do orçamento. 38

CREATE OR REPLACE PROCEDURE PROC_VALOR_ORCAMENTO (codigoorcamento IN NUMBER) IS BEGIN END PROC_VALOR_ORCAMENTO; / 39

CREATE OR REPLACE PROCEDURE PROC_VALOR_ORCAMENTO (codigoorcamento IN NUMBER) IS CURSOR ITENS (cod number) IS SELECT quantidade, valor_unitario FROM itensorcamento WHERE cod_orcamento = cod; BEGIN OPEN itens(codigoorcamento); -- percorrer registros do cursor acumulando o total -- alterar atributo valor_total tabela orçamento CLOSE itens; END PROC_VALOR_ORCAMENTO; / 40

CREATE OR REPLACE PROCEDURE PROC_VALOR_ORCAMENTO (codigoorcamento IN NUMBER) IS CURSOR ITENS (cod number) IS SELECT quantidade, valor_unitario FROM itensorcamento WHERE cod_orcamento = cod; quant itensorcamento.quantidade%type; valor itensorcamento.valor_unitario%type; total NUMBER := 0; BEGIN OPEN itens(codigoorcamento); LOOP FETCH itens INTO quant, valor; EXIT WHEN itens%notfound; total := total + quant * valor; END LOOP; UPDATE orcamento SET valor_total = total WHERE cod_orcamento = codigoorcamento; COMMIT; CLOSE itens; END PROC_VALOR_ORCAMENTO; / 41

insert into orcamento(cod_orcamento, cliente) values (1, 'ze'); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (100, 'computador', 1000, 10); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (101, 'impressora', 500, 10); insert into itensorcamento(cod_orcamento, cod_produto, quantidade, valor_unitario) values (1, 100, 2, 1000); insert into itensorcamento(cod_orcamento, cod_produto, quantidade, valor_unitario) values (1, 101, 3, 500); SELECT * FROM ORCAMENTO; SELECT * FROM ITENSORCAMENTO; EXECUTE PROC_VALOR_ORCAMENTO(1); SELECT * FROM ORCAMENTO; SELECT * FROM ITENSORCAMENTO; 42

Cursores Exercício: escrever um procedimento chamado ATUALIZA_ESTOQUE que altera o estoque de cada produto da tabela PRODUTOS. o procedimento deve ter como parâmetro de entrada o número do orçamento. 43

CREATE OR REPLACE PROCEDURE ATUALIZA_ESTOQUE (codigoorcamento IN NUMBER) IS CURSOR ITENS (cod number) IS select cod_produto, quantidade from itensorcamento where cod_orcamento = cod; BEGIN OPEN itens(codigoorcamento); -- percorrer itens do orçamento e alterar tabela produto -- para diminuir estoque CLOSE itens; END ATUALIZA_ESTOQUE; / 44

CREATE OR REPLACE PROCEDURE ATUALIZA_ESTOQUE (codigoorcamento IN NUMBER) IS CURSOR ITENS (cod number) IS select cod_produto, quantidade from itensorcamento where cod_orcamento = cod; codp itensorcamento.cod_produto%type; quant itensorcamento.quantidade%type; BEGIN OPEN itens(codigoorcamento); LOOP FETCH itens INTO codp, quant; EXIT WHEN itens%notfound; UPDATE produto SET quantidade_estoque = quantidade_estoque - quant WHERE cod_produto = codp; END LOOP; CLOSE itens; END ATUALIZA_ESTOQUE; / 45

insert into orcamento(cod_orcamento, cliente) values (1, 'ze'); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (100, 'computador', 1000, 10); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (101, 'impressora', 500, 10); insert into itensorcamento(cod_orcamento, cod_produto, quantidade, valor_unitario) values (1, 100, 2, 1000); insert into itensorcamento(cod_orcamento, cod_produto, quantidade, valor_unitario) values (1, 101, 3, 500); SELECT * FROM ORCAMENTO; SELECT * FROM ITENSORCAMENTO; EXECUTE ATUALIZA_ESTOQUE (1); SELECT * FROM ORCAMENTO; SELECT * FROM ITENSORCAMENTO; 46

Cursores Exercício: escrever uma função chamada VALOR_ORCAM que calcula o total de um orçamento e retorna o valor a função deve ter como parâmetro de entrada o número do orçamento 47

CREATE OR REPLACE FUNCTION VALOR_ORCAM (codigoorcamento IN NUMBER) RETURN NUMBER IS TOTAL NUMBER; BEGIN SELECT SUM(quantidade * valor_unitario) INTO TOTAL FROM itensorcamento WHERE cod_orcamento = codigoorcamento; RETURN TOTAL; END VALOR_ORCAM; / /* Para testar */ SELECT COD_ORCAMENTO, NOTA_FISCAL, VALOR_ORCAM(COD_ORCAMENTO) AS VALORTOTAL FROM ORCAMENTO; 48

Oracle 10g: SQL e PL/SQL Triggers Enzo Seraphim

Triggers Um gatilho (trigger) é um procedimento PL/SQL, C ou JAVA associado a uma tabela, visão ou evento. Use triggers para garantir que quando uma operação determinada ocorre, uma ação relacionada também ocorra. 50

Triggers 51

Triggers Uso Gerar valores de colunas derivados automaticamente Prevenir transações inválidas Log transparente Auditoria Modificar dados em tabelas quando INSERT, UPDATE, DELETE são executados em visões etc 52

Triggers Use-as quando necessário. Cuidado com triggers em cascata. 53

Triggers Podem ser chamados quando ocorre um evento para cada registro afetado por um INSERT, UPDATE ou DELETE após o evento antes do evento 54

Triggers Tipos DML triggers ocorrem antes ou após um INSERT, UPDATE ou DELETE Trigger de sentença Trigger de linha Instead of triggers triggers disparadas para executar INSERT, UPDATE ou DELETE em uma tabela quando disparado um INSERT, UPDATE ou DELETE em uma visão. Triggers de operações do banco de dados Disparadas em eventos do sistema SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN 55

Triggers DML triggers Trigger de linha FOR EACH ROW: executa o trigger para cada linha afetada pelo INSERT, UPDATE ou DELETE Trigger de sentença ausência do FOR EACH ROW : executa o trigger uma vez 56

Partes de um trigger 57

Create trigger: sintaxe 58

Create trigger Antes Depois ação tabela Trigger de sentença CREATE TRIGGER trigger_name BEFORE DELETE OR INSERT OR UPDATE ON table_name pl/sql_block código 59

Antes Depois ação tabela Create trigger para cada Trigger de linha CREATE TRIGGER salary_check BEFORE INSERT OR UPDATE ON employees FOR EACH ROW pl/sql_block código 60

Create trigger Trigger de linha é disparado uma vez para cada linha processada dentro do trigger, precisamos ter acesso aos valores dos atributos dos registros que estão sendo alterados pseudo registros: :old :new 61

Trigger de linha Trigger de linha pseudo registros: instrução insert :new instrução update :new :old instrução delete :old 62

Exemplo Orçamento cod_orçamento cliente email nota_fiscal data_orçamento data_notafiscal valor_total 1 contém N ItensOrçamento é N 1 Produto cod_orçamento cod_produto quantidade valor_unitário cod_produto descrição valor_unitário quantidade_estoque 63

Exemplo Modelo Relacional orcamento = {cod_orcamento, cliente, email, notafiscal, data_orcamento, data_nota_fiscal} itensorcamento = { cod_orcamento (orcamento.cod_orcamento), cod_produto (produto.cod_produto), valor_unitario, quantidade} produto = {cod_produto, descricao, valor_unitario, quantidade_estoque} 64

Exemplo Modelo Relacional create table orcamento ( cod_orcamento number, cliente varchar2(20), email varchar2(30), nota_fiscal char default 'N', data_orcamento date, data_notafiscal date, valor_total number(10,2) default 0.0, primary key(cod_orcamento) ); create table produto ( cod_produto number, descricao varchar2(20), valor_unitario number(10,2), quantidade_estoque number, primary key(cod_produto) ); create table itensorcamento( cod_orcamento number, cod_produto number, valor_unitario number(10,2), quantidade number, primary key (cod_orcamento, cod_produto), foreign key (cod_orcamento) references orcamento, foreign key (cod_produto) references produto ); 65

Triggers Exercício: escrever um trigger chamado TRIG_VALOR_UNITARIO_ITENS que busca o valor unitário do produto toda vez que é inserido um item. Usar um cursor para localizar o produto PROD 66

CREATE or REPLACE TRIGGER TRIG_VALOR_UNITARIO_ITENS BEFORE INSERT ON ITENSORCAMENTO FOR EACH ROW declare CURSOR prod (cod number) IS SELECT valor_unitario FROM produto WHERE cod_produto = cod; begin OPEN prod( :new.cod_produto); FETCH prod INTO :new.valor_unitario; CLOSE prod; end; / 67

insert into orcamento(cod_orcamento, cliente) values (1, 'ze'); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (100, 'computador', 1000, 10); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (101, 'impressora', 500, 10); SELECT * FROM ITENSORCAMENTO; insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 100, 2); insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 101, 3); SELECT * FROM ITENSORCAMENTO; 68

Triggers Exercício: escrever um trigger chamado TRIG_VALOR_TOTAL_ORC que atualiza o valor total em orçamento toda vez que é inserido um item. 69

CREATE or REPLACE TRIGGER TRIG_VALOR_TOTAL_ORC AFTER INSERT ON ITENSORCAMENTO FOR EACH ROW begin UPDATE orcamento SET valor_total = valor_total + :new.quantidade * :new.valor_unitario WHERE cod_orcamento = :new.cod_orcamento; end; / 70

insert into orcamento(cod_orcamento, cliente) values (1, 'ze'); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (100, 'computador', 1000, 10); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (101, 'impressora', 500, 10); SELECT * FROM ORCAMENTO; insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 100, 2); insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 101, 3); SELECT * FROM ORCAMENTO; 71

Triggers Exercício: escrever um trigger chamado TRIG_QUANT_ESTOQUE_PROD que atualiza a quantidade no estoque na tabela de produto toda vez que é inserido um item. 72

CREATE or REPLACE TRIGGER TRIG_QUANT_ESTOQUE_PROD AFTER INSERT ON ITENSORCAMENTO FOR EACH ROW begin UPDATE produto SET quantidade_estoque = quantidade_estoque - :new.quantidade WHERE cod_produto = :new.cod_produto; end; / 73

insert into orcamento(cod_orcamento, cliente) values (1, 'ze'); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (100, 'computador', 1000, 10); insert into produto(cod_produto, descricao, valor_unitario, quantidade_estoque) values (101, 'impressora', 500, 10); SELECT * FROM PRODUTO; insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 100, 2); insert into itensorcamento(cod_orcamento, cod_produto, quantidade) values (1, 101, 3); SELECT * FROM PRODUTO; 74

Triggers Tabelas mutantes é uma tabela que esta atualmente sendo modificada por uma instrução DML Trigger que fica em loop 75

Alter trigger Usado para habilitar ou desabilitar triggers Exemplo ALTER TRIGGER nomedotrigger ENABLE; 76

Drop trigger Exemplo DROP TRIGGER nomedotrigger; 77