295
Programação em PL/SQL

Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

  • Upload
    vuque

  • View
    242

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Program aç ão em PL/SQL

Page 2: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura do Curso

Introdução a PL/SQLConceitos Básicos de PL/SQLVariáveis e Dados de ProgramaControle Condicional e SequencialLoopsRegistros em PL/SQLTabelas PL/SQL

Page 3: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura do Curso

SQL em PL/SQLFunções de SQL integradasCursoresProcedimentos e FunçõesPackagesTriggersTratamento de Erros

Page 4: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura do Curso

Testes e DepuraçãoPL/SQL DinâmicoEntrada e Saída em ArquivosDesempenho e Otimização

Page 5: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PL/SQL

Procedural Language extensions to SQL.Usamos esta linguagem no Oracle Servere em aplicações-cliente (p.e. Oracle Forms).Adiciona construções de programação não existentes na linguagem de banco de dados padrão.Permite a combinação de comandos SQL com construções procedurais.

Page 6: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Versões do PL/SQL

Versão 2.0 - Oracle 7.0Versão 2.1 - Oracle 7.1Versão 2.2 - Oracle 7.2Versão 2.3 - Oracle 7.3Versão 8.0 - Oracle 8.0

Versão 1.1 -Developer/2000Versão 8.0 -Developer 6

Cliente Servidor

Page 7: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Arqui t e t ura do PL/SQL

Oracle Forms

Geradorde SQL

Programa PL/SQL local

PL/SQL V8.0Runtime Engine

Oracle Server

Processador de comandos

SQL

Stored Program Unit

PL/SQL V8.0Runtime Engine

Page 8: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Am bient es de Ex ec uç ão

ServidorOracle Oracle 7: PL/SQL versão 27: PL/SQL versão 2

Oracle Oracle 8: PL/SQL versão 88: PL/SQL versão 8

SQL*SQL* Plus Plus (modo interativo)(modo interativo)

ClienteOracle DeveloperOracle Developer ((FormsForms, , ReportsReports e e Procedure BuilderProcedure Builder))

utilizam compiladores PL/SQL próprios

Page 9: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os Básic os daLinguagem PL/SQL

Page 10: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Charac t er Set do PL/SQL

Tipo CaracteresLetras A-Z, a-z

Dígitos 0-9

Símbolos ~ ! @ # $ % & * ( ) _- + = | [ ] { } : ; < >, . ? /

Espaço em Branco Tab, espaço, Enter

Page 11: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Charac t er Set do PL/SQL

O PL/SQL não é uma linguagem sensível ao contexto.

letras maiúsculas são tratadas da mesma letras maiúsculas são tratadas da mesma maneira que minúsculas, a não ser no caso maneira que minúsculas, a não ser no caso destas pertencerem a uma cadeia de destas pertencerem a uma cadeia de caracteres.caracteres.

If x < > ´ s´ thenIf x < > ´ S then

Page 12: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Sím bolos Sim ples e Com post os

S ím b o lo D escr içã o; te rm in ad o r d e co m an d o s

% in d icad o r d e a trib u to (p .e .% IS O P E N ); s ím b o lo w ild ca rd

_ sím b o lo w ild ca rd: in d icad o r d e v ariáv e l h o sp ed e ira* * o p erad o r ex p o n en c ia l< > e != d ife ren te| | o p e rad o r d e co n ca ten ação< < e > > d e lim itad o r d e ró tu lo

< = e > = m en o r o u igu a l e m a io r o u igu a l:= o p erad o r d e a trib u ição= > o p erad o r d e asso c iação p a ra

n o tação p o s ic io n a l-- co m en tá rio em u m a ú n ica d e lin h a/* e * / in íc io e fim d e co m en tá rio

Page 13: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Charac t er Set do PL/SQL

Caracteres são agrupados, formando unidades léxicas, que são os menores componentes individuais da linguagem.Uma unidade léxica pode formar:

identificadoresidentificadores

literaisliterais

delimitadoresdelimitadores

comentárioscomentários

Page 14: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ident i f ic adores

Identificador é um nome para um objeto PL/SQL.

constante, variável,constante, variável, exceptionexception, procedimento, , procedimento, função,função, packagepackage, registro, tabela PL/SQL, cursor , registro, tabela PL/SQL, cursor e palavra reservada.e palavra reservada.

Até 30 caracteres.Tem que começar com uma letra.Pode incluir $, _ e # .Não pode conter espaços.

Page 15: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Li t era is

Literal é um valor não representado por um identificador; é simplesmente um valor.Número

415, 21.6 ou NULL415, 21.6 ou NULL

StringEsta é uma frase , 01Esta é uma frase , 01--0303--97 ou NULL97 ou NULL

BooleanTRUE, FALSE ou NULLTRUE, FALSE ou NULL

Page 16: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Del im i t adores

Delimitador Ponto e vírgula (;)Indica o final de um comandoIndica o final de um comandoIF salario < min_salarioTHEN

salario := salario + salario * .25;END IF;

Page 17: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com ent ár ios

Comentário de uma única linhaIFIF salariosalario < min_< min_salariosalario(1994) (1994) ---- retorna min salário do anoretorna min salário do ano

THENTHENsalariosalario :=:= salariosalario * .25;* .25;

END IF;END IF;

Comentário de múltiplas linhasPROCEDURE calcula_receita (empresa IN NUMBER) ISPROCEDURE calcula_receita (empresa IN NUMBER) IS

/* Programa alterado em 23/9/94/* Programa alterado em 23/9/94

Analista Responsável: Manoel de Souza * /Analista Responsável: Manoel de Souza * /

......

Page 18: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura de um Bloc o

A estrutura da linguagem PL/SQL é orientada a blocosModularização

um bloco é a unidade básica de trabalho da um bloco é a unidade básica de trabalho da qual procedimentos e funções são construídosqual procedimentos e funções são construídos

Escopoo bloco oferece um escopo ou contexto para o bloco oferece um escopo ou contexto para objetos logicamente relacionadosobjetos logicamente relacionados

Page 19: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Seç ões de um Bloc o

Cabeçalho (Header)determina o modo como o bloco deve ser chamadodetermina o modo como o bloco deve ser chamado

Seção de Declaraçãoonde declaramos variáveis, cursores e subonde declaramos variáveis, cursores e sub--blocos e blocos e seções de exceçãoseções de exceção

Seção de Execuçãoparte que contém o código a ser executadoparte que contém o código a ser executado

Seção de Exceções (Exceptions)manipula exceções ao processamento normal manipula exceções ao processamento normal (condições de aviso e erro).(condições de aviso e erro).

Page 20: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Seç ões de um Bloc o

CabeçalhoCabeçalho

IS

Seção de DeclaraçãoSeção de Declaração

BEGIN

Seção de ExecuçãoSeção de Execução

EXCEPTION

Seção de ExceptionsSeção de Exceptions

END;

Page 21: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Seç ões de um Bloc o

Blocos AnônimosNão possuem nomeNão possuem nome DECLARE

Seção de DeclaraçãoSeção de Declaração

BEGIN

Seção de ExecuçãoSeção de Execução

EXCEPTION

Seção de ExceptionsSeção de Exceptions

END;

Page 22: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Bloc os Aninhados

Um bloco pode conter um ou mais sub-blocos de código.

As variáveis dos blocos As variáveis dos blocos externos podem ser externos podem ser referenciadas nos referenciadas nos blocos internos, porém blocos internos, porém não o contrário.não o contrário.

PROCEDURE calcula_totaisIS

total_ano NUMBER;BEGIN

total_ano := 0;DECLARE

total_mês NUMBER;BEGIN

total_mês := total_ano / 12;END;

END;

Page 23: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáveis e Dados de Program a

Page 24: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is

Atributos de uma variávelnome, tipo e valornome, tipo e valor

NomePode ter até 30 caracteresPode ter até 30 caracteres

Tem que começar com uma letraTem que começar com uma letra

ConstanteTipo especial de variávelTipo especial de variável

Valor é constanteValor é constante

Page 25: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Dados

Número BINARY_INTEGERDECDECIMALDOUBLE PRECISIONFLOATINTINTEGERNATURALNUMBERPOSITIVEREALSMALLINT

Caractere CHARCHARACTERLONGLONG RAWRAWROWIDSTRINGVARCHARVARCHAR2

Boleano BOOLEANData-hora DATE

Page 26: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Dados

Existem no banco de dados: Number, Char, Long, Long Raw, Raw, Rowid, Varchar2, Date.

Binary_Integer: Utilizado para armazenar inteiros com sinal. Com intervalo de: -2147483647 .. 2147483647Subtipos:

Natural (de 0 .. 2147483647) Positive (de 1 .. 2147483647)

Page 27: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Dados Num ér ic os

Utilize NUMBER para armazenar números (inclusive ponto-flutuante)Precisão Máxima: 38 dígitos

1.0E1.0E--129 até 9.999E125129 até 9.999E125Declaração de uma variável numérica:

NUMBER ( precisão, escala )NUMBER ( precisão, escala )precisão: número total de dígitosprecisão: número total de dígitosescala: número de dígitos a direita ou escala: número de dígitos a direita ou

esquerda do ponto decimal em que o esquerda do ponto decimal em que o arredondamento ocorrerá.arredondamento ocorrerá.

Page 28: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Dados Num ér ic os

Se a escala é positiva, então a escala determina que o ponto onde o arredondamento ocorre está a direita do ponto decimal.Se a escala é negativa, então a escala determina que o ponto onde o arredondamento ocorre está a esquerda do ponto decimal.Se a escala é zero, então o arredondamento ocorre para a parte inteira do número.Se a escala não é especificada, então o arredondamento não ocorre.

Page 29: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

VALOR FORMATO RESULTADO

12345.6784 NUMBER(10,3) 12345.6781234567891.23 NUMBER(10,3) ERROR1567899 NUMBER(10,-6) 200000053.35 NUMBER(10,-6) 0

EXEMPLO:

Tipos de Dados Num ér ic os - Ex em plos

Page 30: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Subt ipos Num ér ic os Pré-def in idos

Subtipo Compatibilidade Correspondente noOracle

DEC (prec, esc) ANSI NUMBER(prec, esc)

DECIMAL(prec, esc) IBM NUMBER(prec, esc)

DOUBLEPRECISION

ANSI NUMBER

FLOAT ANSI, IBM NUMBERINT ANSI NUMBER(38)INTEGER ANSI, IBM NUMBER(38)REAL ANSI NUMBERSMALLINT ANSI, IBM NUMBER(38)

Page 31: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Carac t eres

CHARSubtipos: Subtipos: Character Character e string.e string.

especifica que a variável tem um tamanho fixoespecifica que a variável tem um tamanho fixo

podepode--se especificar o tamanho máximo (1 até se especificar o tamanho máximo (1 até 32767)32767)

se o tamanho não for especificado, o valor padrão se o tamanho não for especificado, o valor padrão é 1 (um).é 1 (um).

espaços em branco são adicionados ao final da espaços em branco são adicionados ao final da variável, se esta armazenar uma cadeia de variável, se esta armazenar uma cadeia de caracteres de tamanho menor que o máximo.caracteres de tamanho menor que o máximo.

Page 32: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Carac t eres

VARCHAR2 e VARCHARarmazenam cadeias de caractere de tamanho armazenam cadeias de caractere de tamanho variável.variável.

podepode--se especificar o tamanho máximo (1 até se especificar o tamanho máximo (1 até 32767)32767)

VARCHAR2 e VARCHAR são sinônimos VARCHAR2 e VARCHAR são sinônimos (visando a compatibilidade com bancos de (visando a compatibilidade com bancos de dados ANSI).dados ANSI).

Recomendação daRecomendação da OracleOracle: utilize VARCHAR2: utilize VARCHAR2

Page 33: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Carac t eres

LONGarmazenam cadeias de caractere de tamanho armazenam cadeias de caractere de tamanho variável, de até 32760 caracteres.variável, de até 32760 caracteres.

recomendação: utilize VARCHAR2.recomendação: utilize VARCHAR2.

RAWarmazena dados binários de até 32767 bytesarmazena dados binários de até 32767 bytes

o PL/SQL não tenta interpretar os dadoso PL/SQL não tenta interpretar os dados

LONG RAWarmazena dados binários de até 32760 bytesarmazena dados binários de até 32760 bytes

Page 34: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Row id

No database Oracle, ROWID é uma pseudocoluna, pertencente a toda tabela.Internamente gerado, ocupando 6 bytes.ROWID em PL/SQL é um subtipo do CHAR com tamanho fixo.BBBBBBB.RRRR.FFFF

bloco no database file, linha no bloco e bloco no database file, linha no bloco e database filedatabase file

Page 35: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Booleano (BOOLEAN)

Tipo de dados lógico (não existe correspondente no servidor Oracle).Pode assumir os valores TRUE, FALSE ou NULL.

Page 36: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dat a-hora (DATE)

Uma variável do tipo DATE armazena tanto informações sobre data quanto sobre hora.Valor de tamanho fixo, que ocupa 7 bytes.DATE armazena as seguintes informações:

século, ano, mês, dia, hora, minuto e século, ano, mês, dia, hora, minuto e segundosegundo

Datas válidas para uma variável data estão Datas válidas para uma variável data estão entre 1 jan de 4712 AC a 31 dez de 4712 DC.entre 1 jan de 4712 AC a 31 dez de 4712 DC.

Podem ser feitas operações aritméticas sobre um valor do tipo DATE.

Page 37: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conversão ent re T ipos

Sempre que o PL/SQL efetua uma operação envolvendo um ou mais valores, ele primeiro converte os dados para o formato correto para a operação.Conversão Explícita

é usada uma função de conversão préé usada uma função de conversão pré--definidadefinida

Conversão Implícitasempre que necessário, o PL/SQL tenta converter sempre que necessário, o PL/SQL tenta converter os valores para efetuar a operaçãoos valores para efetuar a operação

Page 38: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Valores Nulos em PL/SQL

NULL nunca é igual a qualquer outra coisaIF nome = NULL THEN ... IF nome = NULL THEN ... ---- ERRADOERRADO

Quando usados uma função utilizando um valor nulo, geralmente recebemos como resultado um outro valor nulo.

nome := NULL;nome := NULL;IF LENGTH(nome) = 0 THEN IF LENGTH(nome) = 0 THEN ---- Não funcionaNão funciona

Maneira correta da comparação:< identificador> IS NULL< identificador> IS NULL

< identificador> IS NOT NULL< identificador> IS NOT NULL

Page 39: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Valores Nulos em PL/SQL

Resultado de funções com argumento NULL:ConcatenaçãoConcatenação

Existem duas maneiras de efetuarmos uma concatenação: função CONCAT ou operador | |Nos dois casos, o valor NULL é ignorado

Função NVLFunção NVLnova_desc := NVL(antiga_desc, Não aplicavel );

Função REPLACEFunção REPLACEREPLACE( a.b.c.d.e.f. , . , NULL) = > abcdef

Page 40: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão de Var iáve is

Antes de fazer qualquer referência a uma variável, a mesma deve ser declarada.Sintaxe

< nome_var> < tipo> [ atribuição de valor padrão]< nome_var> < tipo> [ atribuição de valor padrão]

Page 41: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão de Var iáve is

Exemplosdata_data_admissaoadmissao DATE;DATE;

achou BOOLEAN;achou BOOLEAN;

total NUMBER(15,2);total NUMBER(15,2);

paragrafoparagrafo VARCHAR2(2000);VARCHAR2(2000);

proxprox_aumento CONSTANT DATE := 15_aumento CONSTANT DATE := 15--APRAPR--96 ;96 ;

limite NUMBER DEFAULT 3;limite NUMBER DEFAULT 3;

nomnom__emprempr VARCHAR2(50) NOT NULL DEFAULT VARCHAR2(50) NOT NULL DEFAULT PCS R USPCS R US

Page 42: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Cont ro le Condic ional e Sequenc ia l

Page 43: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com andos IF...

Permitem que seja construída uma lógica condicional nas aplicações.

IF <condição> THEN <comandos> - TRUEEND IF;

Determina se os comandos entre oTHEN e o END IF serão executados,de acordo com a condição.

IF <condição> THEN <comandos> - TRUEELSE <comandos> - FALSEEND IF;

Baseado na condição informada, seráexecutado o código entre o THEN e oELSE (TRUE) ou entre ELSE e o ENDIF (FALSE).

IF <condição> ...ELSIF <condição> ELSE <comandos>END IF

seleciona uma ação dentre váriascondições mutuamente exclusivas,executando os comandos associados àcondição.

Page 44: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com binaç ão IF-THEN

ExemplosIF :empresa.total > mediaIF :empresa.total > mediaTHENTHEN

aplicar_desconto(:empresa.empresa_id);aplicar_desconto(:empresa.empresa_id);END IF;END IF;

IFIF relatoriorelatorio_pedido_pedidoTHENTHEN

imprime_imprime_relatoriorelatorio((relatoriorelatorio_id);_id);END IF;END IF;

Page 45: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com binaç ão IF-THEN-ELSE

ExemploIF :cliente.total_pedido >IF :cliente.total_pedido > maxmax_permitido_permitidoTHENTHEN

pedido_excedente := TRUE;pedido_excedente := TRUE;ELSEELSE

pedido_excedente := FALSE;pedido_excedente := FALSE;END IF;END IF;

Page 46: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com binaç ão IF-ELSIF

ExemploIFIF salariosalario < 10000 < 10000 THENTHEN

bonusbonus := 2000;:= 2000;ELSIFELSIF salariosalario < 20000 < 20000 THENTHEN

bonusbonus := 1500;:= 1500;ELSIFELSIF salariosalario < 40000 < 40000 THENTHEN

bonusbonus := 1000;:= 1000;ELSEELSE

bonusbonus := 500;:= 500;END IF;END IF;

Page 47: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com ando GOTO

Desvio incondicional para um rótulo definido no programa.

GOTO nome_rotulo;GOTO nome_rotulo;......< < nome_rotulo> >< < nome_rotulo> >......

Pelo menos um comando deve existir após a definição de um rótulo.O rótulo deve ser único no escopo.

Page 48: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com ando GOTO

Rótulo destino deve estar no mesmo escopo que o comando GOTO.

IF, BEGIN,IF, BEGIN, LoopLoop, módulo., módulo.

Rótulo destino deve estar na mesma parte do bloco PL/SQL que o comando GOTO.

ex.: um GOTO na seção executável não pode ex.: um GOTO na seção executável não pode desviar para a seção de desviar para a seção de exceptionsexceptions..

O código resultante com o uso do GOTO pode tornar-se complexo e desestruturado, dificultando a manutenção.

Page 49: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com ando NULL

Melhorar a clareza do programa

IF :IF : reportreport ..selectionselection = DETAIL = DETAIL THENTHEN

execexec__detaildetail__reportreport ;;ELSEELSE

NULL;NULL;END IF;END IF;

Tirar o efeito de uma exceptionProjeto top-down dos módulos do sistema.Utilização conjunta com o GOTO.

Page 50: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SQL* Plus

Page 51: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SQL* Plus

Permite introduzir interativamente instruções de SQL e blocos PL/SQL a partir de uma linha de comandos que são enviadas diretamente para a base de dadosComandos não são sensíveis a maiúsculas e minúsculas

Page 52: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is de Subst i t u iç ão

Identificadas pelo caracter &Substituição textual da variável antes de enviar a instrução para o servidorExemplo:

select select * * from empfrom empwhere empnowhere empno= &num_empregado;= &num_empregado;

Page 53: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is de Assoc iaç ão

Variáveis de memória, podendo ser utilizadas em um ou mais blocos PL/SQLTipos válidos:

VARCHAR2VARCHAR2

CHARCHAR

NUMBERNUMBERNão podem ser restringidas por precisão ou

escala

REFCURSOR (a partir do SQL*REFCURSOR (a partir do SQL* Plus Plus 3.2)3.2)

Page 54: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is de Assoc iaç ão

Exemplo:SQL> VARIABLE v_contador NUMBERSQL> VARIABLE v_contador NUMBERSQL> BEGINSQL> BEGIN

22 SELECT COUNT(*)SELECT COUNT(*)33 INTO :v_contadorINTO :v_contador44 FROM FROM empemp

55 WHERE WHERE empno empno > 1000;> 1000;6 END;6 END;7 /7 /

SQL> PRINT v_contadorSQL> PRINT v_contador

Após a execução, a variável v_contador Após a execução, a variável v_contador conterá o resultado do conterá o resultado do select select feito no bloco.feito no bloco.

Page 55: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

EXECUTE

Uma chamada a stored procedures deve ser feita através do comando EXECUTEExemplo:

EXECUTE minha_EXECUTE minha_procedureprocedure(param1,...);(param1,...);O SQL*O SQL* Plus Plus enviará o seguinte bloco PL/SQL enviará o seguinte bloco PL/SQL para a base de dados:para a base de dados:BEGIN minha_BEGIN minha_procedureprocedure(param1,...); END;(param1,...); END;

Page 56: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex ec ut ar Arqu ivos de Inst ruç ões

Para executar quaisquer instruções SQL ou blocos PL/SQLPode-se utilizar start ou @Exemplos:

start start cria_cria_procproc.sql .sql startstart cria_cria_funcfuncstart start pacote1.pacote1.pckpck@@funcaofuncao_teste._teste.fncfnc

A extensão default é sql

Page 57: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SHOW ERRORS

Mostra erros de compilação armazenados na view user_errorsUtilizado após uma tentativa de criar stored procedures e receber a mensagem:WarningWarning: : Procedure created with compilation errorsProcedure created with compilation errors

Page 58: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I .1

Faça um script que, dado um número inteiro, retorne o sua raiz quadrada (p/ rodar no SQL* Plus).Sugestões:

utilize a função SQRTutilize a função SQRT

utilize o modo de entrada de dados do SQL*utilize o modo de entrada de dados do SQL* PlusPlus(&(&variavelvariavel))

construa um bloco anônimoconstrua um bloco anônimo

utilize o comando DBMS_OUTPUT.PUT_LINEutilize o comando DBMS_OUTPUT.PUT_LINE

Page 59: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I .2

Faça um script que calcule as raízes de uma equação de 2o grauSugestões:

utilize o módulo de entrada de dados do SQL*utilize o módulo de entrada de dados do SQL* PlusPlus(&(&variavelvariavel))

construa um bloco anônimoconstrua um bloco anônimo

Obs.: eq = ax2 + bx + c = 0raiz1 = ( raiz1 = ( --b +b + sqrtsqrt(b(b22 -- 4.a.c) ) / 2.a4.a.c) ) / 2.a

raiz2 = ( raiz2 = ( --b b -- sqrtsqrt(b(b22 -- 4.a.c) ) / 2.a4.a.c) ) / 2.a

Page 60: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loops

Page 61: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Um loop permite que um mesmo código seja executado repetidamente.

LoopLoop SimplesSimples

LoopLoop FOR (p/ números e cursores)FOR (p/ números e cursores)

LoopLoop WHILEWHILE

Na maioria dos casos, uma lógica que requer um loop pode usar qualquer das três construções existentes.

Page 62: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop Sim ples

LOOP< comandos>

END LOOP;

O teste para terminação é feito dentro doloop

EXIT EXIT

EXIT WHEN < condição>EXIT WHEN < condição>

Page 63: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop Sim ples

ExemplosLOOP

balanco_restante := balanco_conta(conta_id);IF balanco_restante < 1000 THEN

EXIT;ELSE

aplicar_balanco(conta_id, balanco_restante);END IF;

END LOOP; LOOPbalanco_restante := balanco_conta(conta_id);EXIT WHEN balanco_restante < 1000;

aplicar_balanco(conta_id, balanco_restante);END LOOP;

Page 64: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop Sim ples

Quando usarnão existe a certeza de quantas vezes onão existe a certeza de quantas vezes o looploop será será executadoexecutado

oo looploop deve executar pelo menos uma vezdeve executar pelo menos uma vez

Page 65: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR

FOR numéricoFOR <FOR < indiceindice__looploop> IN [REVERSE] < menor> ..< maior>> IN [REVERSE] < menor> ..< maior>LOOPLOOP

< comandos>< comandos>END LOOP;END LOOP;

OO looploop termina quando o código é executado o termina quando o código é executado o número de vezes correspondente ao intervalo número de vezes correspondente ao intervalo informadoinformado

Após cada execução do bloco, o PL/SQL verifica Após cada execução do bloco, o PL/SQL verifica se o valor atual do índice excede a diferença se o valor atual do índice excede a diferença entre o maior e menor número informado na faixaentre o maior e menor número informado na faixa

Page 66: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR

FOR numéricoQuando usar:Quando usar:

código dentro do loop será executado um número fixo de vezes, sem ser necessária uma interrupção

RegrasRegrasnão declare o índice usado no loopnão mude o valor das variáveis usadas para informar

a faixa de valores (a faixa é analisada no início doloop), muito menos o valor do índicenão use o comando EXIT dentro do loop FOR

Page 67: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR

FOR numéricoExemplosExemplos

FOR contador IN 1..10LOOP

...END LOOP;

FOR contador IN REVERSE 1..10LOOP

...END LOOP;

FOR ind_calc IN ini_periodo .. LEAST(fim_periodo,

periodo_atual) LOOP

...END LOOP;

Page 68: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop WHILE

WHILE < condição>LOOP

< comandos>END LOOP;

Executa até que a condição seja falsa.Antes de cada execução do bloco dentro loop, o PL/SQL avalia a condição informada.

Page 69: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop WHILE

Quando usarnão temos certeza de quantas vezes devemos não temos certeza de quantas vezes devemos executar o corpo doexecutar o corpo do looploop

desejamos interromper odesejamos interromper o looploop de acordo com de acordo com uma condiçãouma condição

não necessariamente temos que executar onão necessariamente temos que executar o looplooppelo menos uma vezpelo menos uma vez

Page 70: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop WHILE

WHILE total <= 25000 LOOP...SELECT sal INTO salary FROM emp WHERE ...total := total + salary;

END LOOP;Este exemplo garante a execução ao menos uma vez:

done := FALSE;WHILE NOT done LOOP

sequence_of_statements;done := boolean_expression;

END LOOP;

Page 71: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Regis t ros em PL/SQL

Page 72: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Um registro em PL/SQL é bastante similar à estrutura de linhas em uma tabela.Um registro é uma estrutura de dados composta.O registro como um todo não tem um valor. Cada componente ou campo é que o possui.

Page 73: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Regis t ro

Baseado em Tabelacada campo corresponde a uma coluna em cada campo corresponde a uma coluna em uma tabela, inclusive com o mesmo nomeuma tabela, inclusive com o mesmo nome

Baseado em Cursorcada campo corresponde a uma coluna ou cada campo corresponde a uma coluna ou expressão no comando SELECT de um expressão no comando SELECT de um cursorcursor

Definido pelo Programadorcada campo é definido explicitamente cada campo é definido explicitamente (nome e tipo) através do comando TYPE(nome e tipo) através do comando TYPE

Page 74: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão de um Regis t ro

Baseado em Tabelas< nome_< nome_regreg> < nome_tabela> %ROWTYPE;> < nome_tabela> %ROWTYPE;

DECLARE DECLARE empresa_empresa_regreg empresa%ROWTYPE;empresa%ROWTYPE;

Baseado em Cursores< nome_< nome_regreg> < nome_cursor> %ROWTYPE;> < nome_cursor> %ROWTYPE;

DECLAREDECLAREempresa_empresa_regreg empresa_empresa_curcur%ROWTYPE;%ROWTYPE;

Page 75: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão de um Regis t ro

Definido pelo ProgramadorTYPE < nome_tipo> IS RECORDTYPE < nome_tipo> IS RECORD

( < nome_campo1> < tipo_dado1> ,( < nome_campo1> < tipo_dado1> ,< nome_campo2> < tipo_dado2> ,< nome_campo2> < tipo_dado2> ,......< nome_< nome_campoNcampoN> < tipo_> < tipo_dadoNdadoN> )> )

TYPE cliente_TYPE cliente_regtiporegtipo IS RECORDIS RECORD(cliente_id NUMBER(5),(cliente_id NUMBER(5),cliente_nome cliente.nome%TYPE,cliente_nome cliente.nome%TYPE,total_vendas NUMBER(15,2) );total_vendas NUMBER(15,2) );

Page 76: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tabelas PL/SQL

Page 77: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Def in iç ão

Como um array, uma tabela PL/SQL é uma coleção ordenada de elementos de um mesmo tipo.Uma tabela PL/SQL não tem limites de tamanho, pode ser incrementada dinamicamente.O índice de acesso da tabela não precisa ser um número sequencial. Por exemplo, pode-se usar uma série como número do empregado (como 7369, 7499, 7521, 7566, )

Page 78: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Def in indo um a Tabela PL/SQL

TYPE table_type_name IS TABLE OFdatatype [NOT NULL]

[INDEX BY BINARY_INTEGER];onde onde tabletable__typetype__namename é um tipo especificado é um tipo especificado pelo usuário.pelo usuário.

Na versão 8 a cláusula INDEX BY é opcional.

Page 79: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plos

DECLARETYPE SalTabTyp IS TABLE OF emp.sal%TYPE NOT NULL

INDEX BY BINARY_INTEGER;

DECLARETYPE TimeRecTyp IS RECORD (

hour SMALLINT := 0,minute SMALLINT := 0,second SMALLINT := 0);

TYPE TimeTabTyp IS TABLE OF TimeRecTypINDEX BY BINARY_INTEGER;

Page 80: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Referenc iando Tabelas PL/SQL

DECLARETYPE EmpTabTyp IS TABLE OF emp%ROWTYPE

INDEX BY BINARY_INTEGER;emp_tab EmpTabTyp;

BEGIN...IF emp_tab(1).job = CLERK THEN ...

END;

Page 81: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando Tabelas PL/SQL

DECLARETYPE DeptTabTyp IS TABLE OF dept%ROWTYPE

INDEX BY BINARY_INTEGER;dept_tab DeptTabTyp;

BEGIN/* Select entire row into record stored by first element. */SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;IF dept_tab(1).dname = ACCOUNTING THEN ...

...END;

Page 82: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando Tabelas PL/SQL

DECLARETYPE EmpTabTyp IS TABLE OF emp%ROWTYPE

INDEX BY BINARY_INTEGER;emp_tab EmpTabTyp;i BINARY_INTEGER := 0;CURSOR c1 IS SELECT * FROM emp;

BEGINOPEN c1;LOOP

i := i + 1;/* Fetch entire row into record stored by its element. */FETCH c1 INTO emp_tab(i);EXIT WHEN c1%NOTFOUND;

process data recordEND LOOP;CLOSE c1;

END;

Page 83: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Tabela: COUNT

Retorna o número de elementos na tabela.

...IF ename_tab.COUNT = 50 THEN

...END;

Page 84: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Tabela: DELETE

Este atributo tem 3 formas:tabela.DELETE remove todos os elementos da tabela.DELETE remove todos os elementos da tabela;tabela;

tabela.DELETE(n) remove o elemento n da tabela.DELETE(n) remove o elemento n da tabela;tabela;

tabela.DELETE(m,n) remove o range m .. n.tabela.DELETE(m,n) remove o range m .. n.

É uma instrução completa por si só; não é chamada como parte de uma expressão

Page 85: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Tabela: EXISTS

Retorna TRUE se existir uma linha com índice i na tabela, caso contrário retorna FALSE.

IF sal_tab.EXISTS(i) THENsal_tab(i) := sal_tab(i) + 500;

ELSERAISE salary_missing;

END IF;...

Page 86: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Tabela: FIRST e LAST

Retornam o índice da primeira e da última linha da tabela, respectivamente....FOR i IN emp_tab.FIRST .. emp_tab.LAST LOOP

...END LOOP;

A primeira linha é a que tem o índice mais baixo e a última, o mais elevado.

Page 87: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Tabela: NEXT e PRIOR

Retornam o índice do elemento seguinte ou anterior da tabela, respectivamente.DECLARE

...

i BINARY_INTEGER;BEGIN

..

i := any_tab.FIRST; WHILE i IS NOT NULL LOOP

... process any_tab(i)

i := any_tab.NEXT(i); END LOOP;

END;

Page 88: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SQL em PL/SQL

Page 89: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ins t ruç ões de SQL

Podem dividir-se em seis categorias:DML: linguagem de manipulação de dadosDML: linguagem de manipulação de dados

DDL: linguagem de definição de dadosDDL: linguagem de definição de dados

Controle de transaçõesControle de transações

Controle de sessõesControle de sessões

Controle do sistemaControle do sistema

SQL incorporado (para préSQL incorporado (para pré--compiladores)compiladores)

Page 90: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SQL em PL/SQL

Num programa PL/SQL só podem ser usadas as seguintes instruções:

DML:DML: selectselect,, insertinsert ,, updateupdate, , deletedelete

Controle de transações: Controle de transações: commitcommit, , rollbackrollback, , savepointsavepoint

Existe uma alternativa para o uso de instruções DDL em PL/SQL

A A package package DBMS_SQL, disponível a partir da DBMS_SQL, disponível a partir da versão 2.1 permite a criação de SQL dinâmicoversão 2.1 permite a criação de SQL dinâmico

Page 91: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DML: Selec t

Busca informações do banco de dados para variáveis PL/SQLSELECT emp.ename

INTO v_enameFROM empWHERE emp.empno = 7902;

Deve retornar somente uma linhaA cláusula INTO só é usada em blocos PL/SQL

Page 92: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DML: Inser t

Insere uma linha na tabelaINSERT INTO emp

(empno, ename, job, mgr, hiredate, sal, comm,deptno)VALUES

(1, 'ALBERT', 'SALESMAN', 7698, SYSDATE, 1432, 260, 30);

INSERT INTO emp

SELECT * FROM emp;

Page 93: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DML: Updat e

Altera o conteúdo de uma ou mais linhas de uma tabelaUPDATE empSET sal = sal * 1.2WHERE empno = 1;

Page 94: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DML: Delet e

Elimina uma ou mais linhas de uma tabelaDELETE FROM emp

WHERE empno = 1;

Page 95: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Cláusula WHERE

Nas instruções SELECT, UPDATE e DELETE esta cláusula serve para restringir o conjunto de linhas sobre as quais a operação será executada.Constituída por condições, normalmente de comparação, separadas pelos operadores AND, OR, NOT

Page 96: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Referênc ias de t abelas

As operações de DML referenciam uma tabela, de uma forma geral, no formato:[[ ownerowner.] tabela[@.] tabela[@dblinkdblink]]

onde: owner - usuário onde a tabela foi criadadblink - denominação de uma conexão a um

banco de dados remoto

Page 97: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Sinônim os

Utilizados para facilitar o acesso aos objetos do banco de dados, evitando o uso de owner e dblink para identificá-los.

Exemplo:Exemplo:CREATE PUBLIC SYNONYM empregado FOR CREATE PUBLIC SYNONYM empregado FOR

owner1.owner1.empemp@bd1;@bd1;

Após isto podeApós isto pode--se usar:se usar:

SELECT * FROM empregado;SELECT * FROM empregado;

em vez de ter que fazer:em vez de ter que fazer:

SELECT * FROM owner1.SELECT * FROM owner1.empemp@bd1;@bd1;

Page 98: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-c o lunas

Funções adicionais que só podem ser chamadas a partir de instruções SQL:

CURRVAL e NEXTVALCURRVAL e NEXTVAL

LEVELLEVEL

ROWIDROWID

ROWNUMROWNUM

Page 99: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-c o lunas: CURRVAL e NEXTVAL

Utilizadas com sequências (objetos Oracle para gerar números únicos)sequência.CURRVAL

retorna o valor atual da retorna o valor atual da sequênciasequência

sequência.NEXTVALretorna o próximo valor da retorna o próximo valor da sequênciasequência

Exemplo:SELECT SELECT mymy__seqseq.NEXTVAL .NEXTVAL from from dual;dual;

Page 100: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-c o lunas: LEVEL

Utilizado dentro de uma instrução SELECT que implementa uma pesquisa de árvore hierárquica numa tabela utilizando as cláusulas START WITH e CONNECT BY. Esta pseudo-coluna retorna o nível atual da árvore.

Page 101: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-c o lunas: ROWID

Retorna o endereço físico de uma linha da tabela, num valor do tipo ROWIDUm SELECT utilizando-se de ROWID na cláusula WHERE é o método mais otimizado de se recuperar uma linhaExemplo:v_rowid ROWID;...SELECT ROWID INTO v_rowid FROM emp;...

UPDATE emp set ... WHERE emp.rowid = v_rowid;

Page 102: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-c o lunas: ROWNUM

Retorna o número atual da linha num SELECTUtilizado principalmente na cláusula WHERE para limitar as linhas a serem consideradasSELECT * FROM emp WHERE ROWNUM < 3;

O valor ROWNUM é atribuído a uma linha antes de ser efetuada uma ordenação (ORDER BY)

Page 103: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pr iv i lég ios de Ac esso

Privilégios de ObjetoPara efetuar operações num objetoPrivilégios de SistemaPara efetuar operações numa classe de objetos

Page 104: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

GRANT

Para dar privilégios de acesso Objeto:Objeto:

GRANT privilégio ON objeto TO usuário[WITH GRANT OPTION]

Sistema:Sistema:GRANT privilégio TO usuário

[WITH ADMIN OPTION]

Page 105: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

REVOK E

Para revogar privilégios de acessoObjeto:Objeto:

REVOKE privilégio ON objeto FROM usuário[CASCADE CONSTRAINTS]

Sistema:Sistema:REVOKE privilégio FROM usuário

Page 106: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Per f is de Grupo

Os privilégios comuns podem ser agrupados em ROLES, para facilitar a concessão para vários usuários que possuem o mesmo perfilEm vez de dar privilégios para cada usuário:

CriaCria--se uma role: CREATE ROLE rolese uma role: CREATE ROLE roleConcedemConcedem--se os privilégios: GRANT ... TO se os privilégios: GRANT ... TO roleroleAtribuemAtribuem--se os usuários para essa rolese os usuários para essa roleGRANT role TO usuárioGRANT role TO usuário

PUBLIC: perfil genérico para todos os usuários

Page 107: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Cont ro le de Transaç ões

COMMITSalva as operações da transação e libera locks. As operações são visíveis a outras sessõesROLLBACKDesfaz as operações e libera locksSAVEPOINTPonteiro para marcar o ínicio para onde um ROLLBACK pode ser efetuado

Page 108: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões de SQL in t egradas

Page 109: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Carac t eres

Nome DescriçãoASCII retorna o código ASCII de um caractere

CHR retorna o caractere associado ao código ASCII

CONCAT concatena duas strings

INITCAP transforma a primeira letra de cada palavra emmaiúscula

INSTR retorna a localização em uma string dasubstring especificada

LENGTH retorna o tamanho da string

LOWER converte todas as letras para minúsculas

LPAD adiciona uma string à esquerda

Page 110: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Carac t eres

Nome DescriçãoLTRIM retira do lado esquerdo da string todos os caracteres recebidos

como parâmetroREPLACE substitui uma sequência de caracteres por um conjunto

diferente de caracteresRPAD adiciona os caracteres especificados à direita da string

RTRIM retira do lado direito da string todos os caracteres recebidoscomo parâmetro

SOUNDEX retorna a representação fonética de uma string

SUBSTR retorna a porção especificada da string

TRANSLATE traduz caracteres únicos em uma string por um caracterdiferente

UPPER converte todas as letras para maiúsculas

Page 111: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Carac t eres

ExemplosFUNCTION INSTR(string1 IN VARCHAR2, FUNCTION INSTR(string1 IN VARCHAR2,

string2 IN VARCHAR2 string2 IN VARCHAR2 [ ,[ , pospos__iniini IN NUMBER := 1 IN NUMBER := 1

[ , [ , nthnth__ocorrenciaocorrencia IN NUMBER := 1] ] ) IN NUMBER := 1] ] ) RETURN NUMBERRETURN NUMBER

INSTR( Estou procurando uma palavra , uma ) = > 18

FUNCTION LPAD(string1 IN VARCHAR2, FUNCTION LPAD(string1 IN VARCHAR2, tamanho_tamanho_padpad IN NUMBER IN NUMBER

[ , string_[ , string_padpad IN VARCHAR2]) IN VARCHAR2]) RETURN VARCHAR2RETURN VARCHAR2

LPAD( 55 , 10, 0) = > 0000000055LPAD( 12345678 , 5, 0 ) = > 12345

Page 112: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Carac t eres

ExemplosFUNCTION LTRIM(string1 IN VARCHAR2FUNCTION LTRIM(string1 IN VARCHAR2

[,[ , trimtrim_string IN VARCHAR2])_string IN VARCHAR2])RETURN VARCHAR2RETURN VARCHAR2

LTRIM( Eu gosto de pizza ) = > Eu gosto de pizza

FUNCTION SUBSTR(string_in IN VARCHAR2,FUNCTION SUBSTR(string_in IN VARCHAR2,pospos__ini ini IN NUMBERIN NUMBER

[, tam_[, tam_substrsubstr_in IN _in IN NUMBER])NUMBER])RETURN VARCHAR2RETURN VARCHAR2

SUBSTR( Eu gosto de pizza , 4, 5) = > gostoSUBSTR( Eu gosto de pizza , -1) = > a

Page 113: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Dat as

Nome DescriçãoADD_MONTHS adiciona o número de meses especificado à data

LAST_DAY retorna o último dia do mês da data especificadaMONTHS_BETWEEN retorna o número de meses entre duas datas

NEW_TIME retorna o valor data/hora, com o tempo alteradode acordo com o time zone especificado

NEXT_DAY retorna a data do primeiro dia de semanaespecificado que é maior que a data

ROUND retorna a data arrendondada para o formatoespecificado

SYSDATE retorna a hora/data corrente no Oracle Server

TRUNC trunca a data da sua porção hora, de acordo como formato especificado

Page 114: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões para Dat as

ExemplosLAST_DAY(data_in IN DATE) RETURN DATELAST_DAY(data_in IN DATE) RETURN DATE

LAST_DAY(SYSDATE) - SYSDATE = > número de dias até o final do mês.

NEXT_DAY(data_in IN DATE, NEXT_DAY(data_in IN DATE, nome_dia IN VARCHAR2) nome_dia IN VARCHAR2)

RETURN DATERETURN DATENEXT_DAY( 01-JAN-1997 , MONDAY)

= > 06-JAN-1997

Page 115: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões Num ér ic as

Nome DescriçãoABS valor absoluto do número

COS / ACOS / COSH cosseno; cosseno inverso; cosseno hiperbólicoSIN / ASIN / SINH seno; seno inverso; seno hiperbólicoTAN / ATAN TANH tangente; tangente inversa; tangente hiperbólicaCEIL retorna o teto inteiro de um número

EXP(n) e elevado à n-ésima potência

FLOOR maior inteiro menor ou igual ao número

LN(a) logaritmo natural de a.

LOG(a, b) logaritmo na base a de b.

MOD(a, b) resto da divisão de a por b.

Page 116: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões Num ér ic as

Nome DescriçãoPOWER(a,b) a elevado à b-ésima potência

ROUND(a,b) retorna a arredondado em b casas decimais

SIGN(a) retorna 1 se a > 0, 0 se a = 0 e -1 se a < 0

SQRT raiz quadrada de um número

TRUNC(a, [b]) a truncado até b casas decimais

Page 117: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Out ras Funç ões

Nome DescriçãoDECODE retorna o resultado de uma comparação no estilo if-then-elseDUMP retorna uma string contendo um dump da expressão especificada

GREATEST retorna o maior dos valores especificadosLEAST retorna o menor dos valores especificadosNVL substitui o valor NULL por um outro valorSQLCODE retorna o número do erro do Oracle para a exception mais recente

SQLERRM retorna a mensagem de erro do Oracle para a exception maisrecente

UID retorna o User ID da sessão corrente no Oracle

USER retorna o nome do usuário logado

USERENV retorna uma string contento infos sobre a sessão corrente no OracleVSIZE retorna o número de bytes da representação interna do valor

especificado

Page 118: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Out ras Funç ões

ExemplosFUNCTION SQLCODE RETURN INTEGERFUNCTION SQLCODE RETURN INTEGER

FUNCTION SQLERRM RETURN VARCHAR2FUNCTION SQLERRM RETURN VARCHAR2EXCEPTION

WHEN OTHERS THENMESSAGE( Error | | TO_CHAR(SQLCODE)

| | : | | SQLERRM);

Page 119: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões de Conversão

Nome DescriçãoCHARTOROWID converte uma string para ROWID

CONVERT converte uma string de uma character setpara outro

HEXTORAW converte de hexadecimal para o formatoRAW

RAWTOHEX converte de raw para hexadecimal

ROWIDTOCHAR converte de ROWID para uma string

TO_CHAR converte um número ou data para string

TO_DATE converte uma string para data

TO_NUMBER converte uma string para número

Page 120: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ão TO_CHAR

FUNCTION TO_CHAR(param IN { DATE/NUMBER} ,[ , formato IN VARCHAR2[, nls_language IN

VARCHAR2]] )RETURN VARCHAR2

TO_CHAR(SYSDATE, TO_CHAR(SYSDATE, MonthMonth DD, YYYY)DD, YYYY)= >= > MarchMarch 10,199710,1997

TO_CHAR(564.70, $999.9 ) = > $564.7TO_CHAR(564.70, $999.9 ) = > $564.7

TO_CHAR(564.70, $0000999.9 ) = > $0000564.7TO_CHAR(564.70, $0000999.9 ) = > $0000564.7

Page 121: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ão TO_DATE

FUNCTION TO_DATE(param IN { VARCHAR2|NUMBER}[ , formato IN VARCHAR2[, nls_language IN VARCHAR2 ] ] )

RETURN DATETO_DATE( 123198 , MMDDYY) = > 31TO_DATE( 123198 , MMDDYY) = > 31--DECDEC--19981998

TO_DATE( 16/7/94 , DD/MM/YY) = > 16TO_DATE( 16/7/94 , DD/MM/YY) = > 16--JULJUL--19941994

Page 122: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ão TO_NUMBER

FUNCTION TO_NUMBER(string_in INCHAR|VARCHAR2}

[ , formato IN VARCHAR2[, nls_language VARCHAR2]] )

RETURN NUMBER

TO_NUMBER( 123.23 ) = > 123.23TO_NUMBER( 123.23 ) = > 123.23

TO_NUMBER(TO_NUMBER( abcdefabcdef ) = > ERRO) = > ERRO

Page 123: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões de Grupo

Somente para SELECT com GROUP BYNome Descrição

AVG retorna a média dos valores da colunaCOUNT retorna o número de linhas que a coluna não é nulaMAX retorna o valor máximo da colunaMIN retorna o valor mínimo da colunaSTDDEV retorna o desvio padrão da coluna

SUM retorna a soma dos valores da colunaVARIANCE retorna a variância estatística da coluna

Page 124: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Cursores

Page 125: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Um cursor pode ser encarado como um ponteiro para a tabela virtual no banco de dados representada pelo comando SELECT associado.

Ex.:Ex.:CURSOR empregado_CURSOR empregado_curcur ISIS

SELECT * FROM empregado;SELECT * FROM empregado;OPEN empregado_OPEN empregado_curcur;;FETCH empregado_FETCH empregado_curcur INTO empregado_INTO empregado_recrec;;CLOSE empregado_CLOSE empregado_curcur;;

Page 126: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Operaç ões em Cursores

OPENabre o cursor, faz o abre o cursor, faz o parseparse e o e o bindbind da da consulta associada, identificando o resultadoconsulta associada, identificando o resultado

o cursor é posicionado antes da primeira linha.o cursor é posicionado antes da primeira linha.

FETCHbusca a linha corrente do cursor e o posiciona na busca a linha corrente do cursor e o posiciona na próxima próxima

CLOSEfecha o cursor e libera a memória alocada.fecha o cursor e libera a memória alocada.

Page 127: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Cursores

Cursores Estáticossempre referenciam um comando SQL, que é sempre referenciam um comando SQL, que é conhecido em tempo de compilação.conhecido em tempo de compilação.

Variáveis Cursoresa variável referencia um objeto cursor e pode a variável referencia um objeto cursor e pode referenciar diferentes comandos SQL em referenciar diferentes comandos SQL em ocasiões diferentes.ocasiões diferentes.

novanova featurefeature do PL/SQL.do PL/SQL.

Page 128: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Cursores

Implícitoso PL/SQL utiliza um cursor implícito sempre que o PL/SQL utiliza um cursor implícito sempre que um comandos SQL é executado diretamente no um comandos SQL é executado diretamente no código, desde que o código não utilize um cursor código, desde que o código não utilize um cursor explícitoexplícito

usados em cada UPDATE, INSERT ou DELETEusados em cada UPDATE, INSERT ou DELETE

são menos eficientes que cursores explícitossão menos eficientes que cursores explícitos

mais suscetíveis a erromais suscetíveis a erro

Page 129: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Cursores

Explícitoscomando SELECT explicitamente definido na comando SELECT explicitamente definido na seção de declaração, sendo um nome seção de declaração, sendo um nome associado a ele associado a ele

usados quando desejamos recuperar mais de usados quando desejamos recuperar mais de uma linha de resultadouma linha de resultado

não existem para comandos de UPDATE, não existem para comandos de UPDATE, INSERT e DELETEINSERT e DELETE

Page 130: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão

CURSOR nome_cursor [ ( [ parâmetro [ , parâmetro ...] ) ][ RETURN especificação_retorno ]IS comando_SELECT;

Page 131: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is em um Cursor

Nome do Cursor não é uma variávelNo PL/SQL, a lista de itens no SELECT pode conter colunas, variáveis do PL/SQL e variáveis associadas (p.e. Oracle Forms).

DECLAREDECLAREbonusbonus NUMBER := 100;NUMBER := 100;CURSOR empregado_CURSOR empregado_curcur ISIS

SELECT empregado_id,SELECT empregado_id, salariosalario ++ bonusbonus,,:: revisaorevisao..avaliacaoavaliacao

FROM empregadoFROM empregadoWHEREWHERE dtdt__contratcontrat < ADD_MONTHS(SYSDATE, < ADD_MONTHS(SYSDATE, --36);36);

Page 132: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Prec edênc ia de um Ident i f ic ador

Em um cursor, existe precedência do nome da coluna sobre o nome de uma variável PL/SQL.

PROCEDURE melhorar_SQL PROCEDURE melhorar_SQL

ISISsalariosalario NUMBER := 1000;NUMBER := 1000;CURSOR dobrar_sal_CURSOR dobrar_sal_curcur ISIS

SELECTSELECT salariosalario ++ salariosalarioFROM empregadoFROM empregado

WHERE WHERE dtdt__contratcontrat < ADD_MONTHS(SYSDATE,< ADD_MONTHS(SYSDATE,--36);36);BEGINBEGIN

Page 133: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

A c laúsula RETURN

Somente pode ser usada para cursores que estão contidos em um package.A claúsula RETURN pode ser feita com as seguintes estruturas:

UmUm recordrecord definido a partir de uma tabela, definido a partir de uma tabela, usando %ROWTYPEusando %ROWTYPE

UmUm recordrecord definido a partir de umdefinido a partir de um recordrecord prépré--definido pelodefinido pelo progamadorprogamador

Page 134: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo de Uso da c laúsula RETURN

Primeiro a definição da PackagePACKAGE empresa ISPACKAGE empresa IS

CURSOR empresa_CURSOR empresa_curcur (id IN NUMBER) (id IN NUMBER) RETURN empresa%ROWTYPE;RETURN empresa%ROWTYPE;

END empresa;END empresa;

Depois a definição da Package BodyPACKAGEPACKAGE bodybody empresa ISempresa IS

CURSOR empresa_CURSOR empresa_curcur (id IN NUMBER)(id IN NUMBER)RETURN empresa%ROWTYPE ISRETURN empresa%ROWTYPE IS

SELECT * FROM empresaSELECT * FROM empresaWHERE empresa_id = id;WHERE empresa_id = id;

END empresa;END empresa;

Page 135: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Porque c o loc ar c ursor num a Pac k age?

Uma package é uma coleção de objetos logicamente relacionadosAgrupando os códigos, torna-se mais fácil a identificação e uso dos códigos pelo programadorCursores em packages são essencialmente caixas pretasO programador não precisa saber como um cursor é recuperado

Page 136: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Abr indo Cursores

OPEN < nome_cursor> [ (parâmetro [ , parâmetro ...] ) ] ;

O comando OPEN não recupera linhas.Todos os fetches refletirão os dados exatamente como da ocasião em que o cursor foi aberto.

Page 137: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Rec uperando Dados de Cursores

FETCH < nome_cursor> INTO < registro_ou_lista_variáveis>

Exemplo:FETCH empresa_FETCH empresa_curcur INTO empresa_INTO empresa_regreg;;

FETCHFETCH maxmax_sal__sal_curcur INTOINTO maxmax_sal;_sal;

FETCHFETCH emprempr__curcur INTOINTO emprempr_nome(1),_nome(1),dtdt__contratcontrat, , :depto.min_:depto.min_salariosalario;;

Page 138: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Fec hando Cursores

CLOSE < nome_cursor>Libera área de memória (SGA).Libera todo bloqueio (lock) causado pelo cursor.Existe um limite máximo de cursores que podem ser abertos no SGBD Oracle.Um cursor é automaticamente fechado quando o seu escopo é abandonado.

Page 139: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores

Nome Descrição

%FOUND retorna TRUE se o registro foirecuperado com sucesso

%NOTFOUND recupera TRUE se o registro não foirecuperado com sucesso

%ROWCOUNT retorna o número de registrosrecuperados até o momento

%ISOPEN retorna TRUE se o cursor estiveraberto

Page 140: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores

%FOUNDOPEN pedido_OPEN pedido_curcur;;FETCH pedido_FETCH pedido_curcur INTO pedido_id, empresa_id;INTO pedido_id, empresa_id;IF pedido_IF pedido_curcur%FOUND THEN%FOUND THEN

:pedido.num_pedidos := :pedido.num_pedidos + 1;:pedido.num_pedidos := :pedido.num_pedidos + 1;END IF;END IF;......

Page 141: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores

%NOTFOUNDOposto ao %FOUNDOposto ao %FOUND

Muito utilizado para terminação deMuito utilizado para terminação de loopsloopsEXIT WHEN empresa_cur%NOTFOUND;

Page 142: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores

%ROWCOUNTDECLAREDECLARE

CURSORCURSOR empemp__curcur ISISSELECT nome,SELECT nome, salariosalarioFROM empregadoFROM empregadoORDER BYORDER BY salariosalario DESC;DESC;

empemp__reg empreg emp__curcur%ROWTYPE;%ROWTYPE;BEGINBEGIN

OPENOPEN empemp__curcur;;LOOPLOOP

FETCHFETCH empemp__curcur INTOINTO empemp__regreg;;EXIT WHENEXIT WHEN empemp__curcur%ROWCOUNT > 10 OR%ROWCOUNT > 10 OR

empemp__curcur%NOTFOUND;%NOTFOUND;DBMS_OUTPUT.PUT_LINE(DBMS_OUTPUT.PUT_LINE(empemp__regreg.nome | | .nome | | -- | | | |

empemp__regreg..salariosalario););END LOOP;END LOOP;

END;END;

Page 143: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores

%ISOPENIF NOTIF NOT empemp__curcur%ISOPEN THEN%ISOPEN THEN

OPENOPEN empemp__curcur;;END IF;END IF;

Page 144: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

At r ibut os de Cursores Im pl íc i t os

Quando o RDBMS abre um cursor ou executa um insert, update ou delete, ele torna uma das seguintes variáveis habilitadas:

SQL%FOUNDSQL%FOUND

SQL%NOTFOUNDSQL%NOTFOUND

SQL%ROWCOUNTSQL%ROWCOUNT

SQL%ISOPENSQL%ISOPEN

Page 145: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Parâm et ros em Cursores

Um parâmetro faz com que um cursor se torne mais reutilizável.

DECLAREDECLARECURSOR empresa_CURSOR empresa_curcur (categoria_in VARCHAR2) (categoria_in VARCHAR2)

ISISSELECT nome, categoria, contatoSELECT nome, categoria, contatoFROM empresaFROM empresaWHERE categoria = UPPER(categoria_in);WHERE categoria = UPPER(categoria_in);

Podemos definir um valor padrão para um parâmetro.

CURSORCURSOR empemp__curcur((empemp_in NUMBER := 0)_in NUMBER := 0)

Page 146: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

SELECT ... FOR UPDATE

Quando um comando SELECT ... FOR UPDATE é executado, o Oracleautomaticamente bloqueia a linha de maneira exclusiva

Ninguém conseguirá alterar estes registros Ninguém conseguirá alterar estes registros antes de um ROLLBACK ou COMMITantes de um ROLLBACK ou COMMIT

CURSORCURSOR empemp__curcur ISISSELECT nome,SELECT nome, salariosalarioFROM empregadoFROM empregadoWHEREWHERE salariosalario < 100< 100FOR UPDATE FOR UPDATE

Page 147: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

WHERE CURRENT OF

Esta cláusula é utilizada para comandos DELETE e UPDATE dentro de um cursor.

O registro mais recentemente recuperado é O registro mais recentemente recuperado é apagado ou atualizadoapagado ou atualizado

Exemplo:Exemplo:FETCHFETCH empemp__curcur INTOINTO empemp__regreg;;......UPDATE empregado SETUPDATE empregado SET salariosalario :=:= salariosalario ++ bonusbonusWHERE CURRENT_OFWHERE CURRENT_OF empemp__curcur;;

Page 148: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is Cursores

Disponível a partir das releases 2.2 e 2.3.Possibilidade de passar como parâmetro o resultado de consultas para outros programas.Variáveis cursores são como ponteiros do C ou Pascal, na qual um endereço de memória é assinalado. Declarando uma variável cursor se cria um ponteiro, não um objeto.

Page 149: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Porque usar var iáve is c ursor?

Usa-se uma variável cursor para passar o resultado de uma query entre stored subprograms e aplicações client. Por exemplo, uma aplicação Client, Oracle Forms, e Oracle Server podem ambos se referenciar à mesma área de trabalho.

Page 150: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is Cursores

OPEN cursorOPEN cursor

FETCH reg1FETCH reg1

CLOSE cursorCLOSE cursor

FETCH reg2FETCH reg2

FETCH reg3FETCH reg3

Page 151: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Var iáve is Cursores

ExemploDECLAREDECLARE

TYPE empresa_TYPE empresa_curtipocurtipo IS REF CURSOR IS REF CURSOR RETURN empresa%ROWTYPE;RETURN empresa%ROWTYPE;

empresa_curvar empresa_empresa_curvar empresa_curtipocurtipo;;BEGINBEGIN

OPEN empresa_curvar FOR SELECT * OPEN empresa_curvar FOR SELECT * FROM empresa;FROM empresa;

......

Page 152: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Def in indo um a Var iáve l Cursor

TYPE ref_type_name IS REF CURSOR RETURN return_type;

ondeonde refref__typetype__namename é o nome da variável é o nome da variável especificada para uso subsequente eespecificada para uso subsequente e returnreturn__typetypedeve representar umdeve representar um recordrecord ou umaou uma rowrow na tabela.na tabela.

Exemplo:Exemplo:DECLAREDECLARE

TYPE TYPE DeptCurTypDeptCurTyp IS REF CURSOR IS REF CURSOR RETURN RETURN deptdept%ROWTYPE;%ROWTYPE;

Page 153: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Em um a St ored Proc edure

CREATE PACKAGE emp_data ASTYPE GenericCurTyp IS REF CURSOR;TYPE EmpCurTyp IS REF CURSOR

RETURN emp%ROWTYPE;PROCEDURE open_emp_cv

(emp_cv IN OUT EmpCurTyp, choice IN NUMBER);

END emp_data;

Page 154: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Em um a St ored Proc edure (c ont inuaç ão...)

CREATE PACKAGE BODY emp_data ASPROCEDURE open_emp_cv

(emp_cv IN OUT EmpCurTyp,choice IN NUMBER) IS

BEGINIF choice = 1 THEN

OPEN emp_cv FOR SELECT * FROM emp WHERE comm IS NOT

NULL;ELSIF choice = 2 THEN

OPEN emp_cv FOR SELECT * FROM emp WHERE sal > 2500;

ELSIF choice = 3 THENOPEN emp_cv FOR SELECT * FROM emp

WHERE deptno = 20;END IF;

END open_emp_cv;END emp_data;

Page 155: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop Sim ples para Cursores

As instruções devem ser feitas explicitamente:

Abrir o cursorAbrir o cursor

Colocar o Colocar o fetch fetch dentro do dentro do looploop

Estabelecer a condição para fim do Estabelecer a condição para fim do looploop

Fechar o cursorFechar o cursor

Requer maior atenção do desenvolvedorMaior possibilidade de ocorrer erro

Page 156: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop Sim ples para Cursores

ExemploDECLARE

CURSOR cur_emp IS ...BEGIN

OPEN cur_emp;LOOP

FETCH cur_emp INTO ...EXIT WHEN cur_emp%NOTFOUND;-- processar informações do cursor

END LOOP;CLOSE cur_emp;

END;

Page 157: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR para Cursores

FOR indice_registro IN nome_cursorLOOP

< comandos>END LOOP;

OO looploop termina incondicionalmente quando termina incondicionalmente quando todos os registros do cursor forem todos os registros do cursor forem recuperadosrecuperados

A cada execução doA cada execução do looploop, o PL/SQL verifica o , o PL/SQL verifica o atributo %NOTFOUNDatributo %NOTFOUND

Page 158: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR para Cursores

ExemploDECLAREDECLARE

CURSORCURSOR ocupacaoocupacao__curcur ISISSELECTSELECT hosphosp_id,_id, nmnm_quarto_quartoFROMFROM ocupacaoocupacao WHEREWHERE dtdt__ocupacaoocupacao = SYSDATE;= SYSDATE;

BEGINBEGINFORFOR ocupacaoocupacao__regreg ININ ocupacaoocupacao__curcurLOOPLOOP

atualiza_nota(atualiza_nota(ocupacaoocupacao__regreg..hosphosp_id,_id,ocupacaoocupacao__regreg..nmnm_quarto);_quarto);

END LOOP;END LOOP;END;END;

Page 159: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Loop FOR para Cursores

Quando usar:quando desejamos recuperar e processar quando desejamos recuperar e processar todos os registros do cursortodos os registros do cursornão é apropriado à situações em que não é apropriado à situações em que condições devem ser avaliadas para condições devem ser avaliadas para determinar o término da operação de determinar o término da operação de recuperaçãorecuperação

Observaçãoo índice doo índice do looploop, neste caso uma variável do , neste caso uma variável do tipo registro, é encarado da mesma forma tipo registro, é encarado da mesma forma que índices numéricosque índices numéricos

Page 160: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I .1

Liste os 3 departamentos com maior folha (soma dos salários dos empregados), em ordem decrescente.Sugestão:

Utilize as tabelas Utilize as tabelas dept dept e e emp emp (SCOTT/TIGER)(SCOTT/TIGER)

utilize o procedimento utilize o procedimento DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINE

Page 161: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I .2

De acordo com o salário de um empregado, calcule o imposto de renda correspondente.Sugestões

Utilize a tabelaUtilize a tabela empemp SCOTT/TIGERSCOTT/TIGERNão considere possíveis deduçõesNão considere possíveis deduções

Obs.:salariosalario < 900 < 900 -- isentoisentosalariosalario > 900 e < = 1800 > 900 e < = 1800 -- 15% 15% -- R$135R$135salariosalario > 1800 > 1800 -- 25% 25% -- R$315R$315

Page 162: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I .3

Calcular o total de salários pagos (salário + comissão) para empregados de um departamento. Determinar também quantos empregados tem salário maior que $2000 e quantos tem a comissão maior que o salário.

Page 163: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Subprogram as:Proc edim ent os e Funç ões

Page 164: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Modularizaçãoprocesso de quebrar grandes blocos de processo de quebrar grandes blocos de código em pequenos pedaços (módulos)código em pequenos pedaços (módulos)

torna o código:torna o código:mais reutilizávelmais fácil de gerenciarmais legívelmais confiável

Page 165: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Estruturas para Modularização (PL/SQL):

procedimentoprocedimentobloco que efetua uma ou mais ações, sendo

possível a passagem de informações, tanto para dentro quanto para fora do procedimento

funçãofunçãoretorna um único valor; podemos passar

informações para a função através de parâmetros

Page 166: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

bloco anônimobloco anônimobloco PL/SQL que efetua uma ou mais tarefas;

usado para controlar o escopo dos identificadores e manuseio de exceptions

packagepackagecoleção de procedimentos, funções, tipos e

variáveis; não é exatamente um módulo, mas está relacionado ao assunto

Page 167: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura do Bloc o PL/SQL (Revisão)

CabeçalhoCabeçalho

IS

Seção de DeclaraçãoSeção de Declaração

BEGIN

Seção de ExecuçãoSeção de Execução

EXCEPTION

Seção de ExceptionsSeção de Exceptions

END;

DECLARE

Seção de DeclaraçãoSeção de Declaração

BEGIN

Seção de ExecuçãoSeção de Execução

EXCEPTION

Seção de ExceptionsSeção de Exceptions

END;

Page 168: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura de Bloc os PL/SQL

PROCEDURE contratar(nome_in IN VARCHAR2)

IS

data_contratacao DATE;BEGIN

data_contratacao := SYSDATE - 2;INSERT INTO empregado (nome, data_contratacao)

VALUES (nome_in, data_contratacao);

WHEN DUP_VAL_IN_INDEXTHEN

DBMS_OUTPUT.PUT_LINE( Não inseriu );

EXCEPTION

END;

Page 169: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Esc opo (Revisão)

DECLAREdata_contratacao DATE;

BEGIN

END;

DECLAREdata_contratacao DATE;

BEGIN

END;

DECLAREtotal_vendas NUMBER;

BEGIN

END;

DECLAREtotal_vendas NUMBER;

BEGIN

END;

escopo de total_vendas

escopo de total_vendas

escopo de data_contratacao

escopo de data_contratacao

Page 170: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Proc edim ent os

EstruturaPROCEDURE < nome> [ (parâmetro [ , PROCEDURE < nome> [ (parâmetro [ , parâmetro ...] ) ]parâmetro ...] ) ]ISIS

[comandos de declaração][comandos de declaração]BEGINBEGIN

< comandos>< comandos>[ EXCEPTION[ EXCEPTION

< comandos para manuseio de< comandos para manuseio deexceptionsexceptions> ]> ]END [nome];END [nome];

Page 171: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Proc edim ent os

Chamadaum procedimento é chamado da mesma um procedimento é chamado da mesma maneira que um comando PL/SQLmaneira que um comando PL/SQL

aplicar_desconto(nova_empr_id, 15.00);

Page 172: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Proc edim ent os

Cabeçalhonome do procedimento e lista de parâmetrosnome do procedimento e lista de parâmetros

PROCEDURE aplicar_desconto(empr_id_in IN empresa.empr_id%TYPE, desconto_in IN NUMBER)

Corpocódigo necessário para a execução do código necessário para a execução do procedimentoprocedimento

PROCEDURE nada ISBEGIN

NULL;END;

Page 173: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo de Proc edure

PROCEDURE raise_salary (emp_id INTEGER, increase REAL) IS

current_salary REAL;salary_missing EXCEPTION;

BEGINSELECT sal INTO current_salary FROM empWHERE empno = emp_id;IF current_salary IS NULL THEN

RAISE salary_missing;ELSE

UPDATE emp SET sal = sal + increaseWHERE empno = emp_id;

END IF;EXCEPTION

WHEN NO_DATA_FOUND THENINSERT INTO emp_audit VALUES (emp_id, No such number );

WHEN salary_missing THENINSERT INTO emp_audit VALUES (emp_id, Salary is null );

END raise_salary;

Page 174: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões

EstruturaFUNCTION nome [ (parâmetro [ , parâmetro FUNCTION nome [ (parâmetro [ , parâmetro ...] ) ] ...] ) ]

RETURN tipo_retornadoRETURN tipo_retornadoISIS

[comandos de declaração][comandos de declaração]BEGINBEGIN

comandoscomandos[ EXCEPTION[ EXCEPTION

comandos para manuseio decomandos para manuseio de exceptionsexceptions]]END [nome]END [nome]

Page 175: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões

Chamadauma função é chamada como parte de um uma função é chamada como parte de um comando, sempre que uma expressão pode comando, sempre que uma expressão pode ser usadaser usada

vendas_95 := total_vendas( Marisol , 1995);DECLARE

vendas_95 NUMBER DEFAULT total_vendas( Marisol , 1995);IF total_vendas( Marisol , 1995)

THEN ...

Page 176: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Funç ões

Cabeçalhonome da função, lista de parâmetros enome da função, lista de parâmetros etipo do retornotipo do retorno

FUNCTION total_vendas(nome_in IN empresa.nome%TYPE, ano_in pedido.ano%TYPE)RETURN NUMBER;

Corpocódigo necessário para a execução da funçãocódigo necessário para a execução da função

FUNCTION nada RETURN BOOLEAN ISBEGIN

RETURN TRUE;END;

Page 177: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão RETURN

Encerra a execução da função e retorna o valor para o programa que a chamou.Um subprograma pode conter várias declarações RETURN.Em procedures a declaração RETURN não deve conter uma expressão.Em funções a declaração RETURN deve conter uma expressão que é executada no momento da execução da declaração.

Page 178: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo de Funç ão

FUNCTION sal_ok (salary REAL, title REAL) RETURN BOOLEAN IS

min_sal REAL;max_sal REAL;

BEGINSELECT losal, hisal INTO min_sal, max_salFROM salsWHERE job = title;RETURN (salary >= min_sal) AND (salary <= max_sal);

END sal_ok;

Page 179: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Parâm et ros

Modo de troca de informações entre o módulo e o bloco PL/SQL que o chamou.Quando declaramos um parâmetro, nunca especificamos restrições quanto ao tamanho do tipo de dado.

PROCEDURE mostra_empresa(nome IN PROCEDURE mostra_empresa(nome IN VARCHAR2) IS VARCHAR2) IS

É permitida a utilização de %TYPE e %ROWTYPE na declaração de parâmetros

Page 180: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Modo de Passagem de Parâm et ros

INsomente para leiturasomente para leitura

OUTsomente para escrita (o módulo pode atribuir somente para escrita (o módulo pode atribuir um valor ao parâmetro, que será passado ao um valor ao parâmetro, que será passado ao bloco PL/SQL que o chamou)bloco PL/SQL que o chamou)

IN OUTusado para leitura e escritausado para leitura e escrita

Page 181: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Passagem de Parâm et ros

PROCEDURE combine_formate_nomes (prim_nome IN OUT VARCHAR2,ult_nome IN OUT VARCHAR2, nome_comp OUT VARCHAR2,

formato IN VARCHAR2 := ULTIMO PRIMEIRO )-- O parâmetro formato não precisa obrigatoriamente ser informado

ISBEGIN

IF formato = ULTIMO PRIMEIRO THENnome_comp := ult_nome | | , | | prim_nome

ELSIF formato = PRIMEIRO ULTIMO THENnome_comp := prim_nome | | | | ult_nome;

END IF;END;

Page 182: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Com o o PL/SQL faz a assoc iaç ão dos parâm et ros?

Notação Posicionalassocia o valor ao parâmetro correspondente associa o valor ao parâmetro correspondente implicitamente através da posiçãoimplicitamente através da posição

Notação por Nome Explicitamenteassocia um valor a um parâmetro associa um valor a um parâmetro explicitamente através do seu nomeexplicitamente através do seu nome

vendas_97 := total_vendas(nome_in = > Cia. JK , ano_in = > 1997);

vendas_97 := total_vendas(ano_in = > 1997,nome_in = > Cia. JK );

Page 183: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

St ored Proc edures/Func t ions

Uma stored procedure ou stored functioné uma unidade de programa PL/SQL que:

tem um nometem um nome

pode receber e retornar valorespode receber e retornar valores

fica armazenada no dicionário de dadosfica armazenada no dicionário de dados

pode ser usada por vários usuáriospode ser usada por vários usuários

Page 184: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

St ored Proc edures/Func t ions

CREATE PROCEDURE recupera_emp_reg (emp_numero IN emp.empno%TYPE,emp_reg OUT emp%ROWTYPE) AS

BEGINSELECT empno, ename, job, mgr, hiredate, sal, comm, deptno

INTO emp_retFROM empWHERE empno = emp_numero;

END;

Exemplo:

Page 185: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Módulo Loc al

Procedimento ou função definido da seção de declaração de um bloco PL/SQL.Não pode ser chamado por nenhum outro módulo PL/SQL definido fora do bloco ao qual o mesmo pertence.Vantagens

reduz o tamanho do módulo, eliminando reduz o tamanho do módulo, eliminando códigos repetitivoscódigos repetitivos

torna o código mais legíveltorna o código mais legível

Page 186: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo de Módulos Loc ais

DECLARErent REAL;PROCEDURE raise_rent (increase IN OUT REAL) ISBEGIN

rent := rent + increase;...

END raise_rent;...

BEGIN...raise_rent(rent); indeterminate

Page 187: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dependênc ias dos Subprogram as

Subprogramas são dependentes dos objetos que referenciamCaso algum destes objetos forem alterados por uma operação DDL, o subprograma fica com status INVALID e deve ser recompiladoALTER {PROCEDURE | FUNCTION} nome COMPILE;

Determinação de dependência (no INIT.ORA)

TimestampTimestampAssinaturaAssinatura

Page 188: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pr iv i lég ios de Ac esso

Para poder executar um subprograma é necessário ter o privilégio EXECUTE para o objeto.Um subprograma é executado utilizando os privilégios explícitos do seu owner, sem considerar privilégios de roles.

Page 189: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pac k ages

Page 190: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Uma package é um conjunto de objetos PL/SQL que são empacotados com uma sintaxe especial de BEGIN-END.Podemos colocar em uma package:

cursorescursores

variáveisvariáveis

nomes denomes de exceptionsexceptions

comandos TYPEcomandos TYPE

procedimentos e funçõesprocedimentos e funções

Page 191: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Vantagens de utilizarmos packages:information hidinginformation hiding

projeto orientado a objetosprojeto orientado a objetos

projetoprojeto toptop--downdown

persistência de objetospersistência de objetos

melhor performancemelhor performance

Page 192: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

In t er fac e

Aplicação

Body

Especificação

DataBasePackage

Page 193: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura de um a Pac k age

Especificaçãocontém as definições e especificações de contém as definições e especificações de todos os elementos em uma todos os elementos em uma packagepackage que que podem ser referenciados fora dela.podem ser referenciados fora dela.

PACKAGE nome_package IS[ declarações de variáveis e tipos ][ declarações de cursores ][ declarações de módulos ]END [nome_package] ;

Page 194: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Est rut ura de um a Pac k age

Corpocontém implementação de módulos, cursores contém implementação de módulos, cursores e outros objetose outros objetos

PACKAGE BODY nome_package IS [ declarações de variáveis e tipos ][ especificaçao de comandos SELECT de cursores ][ especificação do corpo de módulos ][ BEGIN

comandos executáveis ][ EXCEPTION

exception handlers ]END [nome_package] ;

Page 195: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo Pac k age - Espec i f ic aç ão

CREATE PACKAGE emp_actions AS specificationTYPE EmpRecTyp IS RECORD (emp_id INTEGER, salary REAL);CURSOR desc_salary RETURN EmpRecTyp;PROCEDURE hire_employee (ename VARCHAR2,

job VARCHAR2,mgr NUMBER,sal NUMBER,comm NUMBER,deptno NUMBER);

PROCEDURE fire_employee (emp_id NUMBER);END emp_actions;

Page 196: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo Pac k age - Body

CREATE PACKAGE BODY emp_actions AS CURSOR desc_salary RETURN EmpRecTyp IS

SELECT empno, sal FROM emp ORDER BY sal DESC;PROCEDURE hire_employee (ename VARCHAR2,

job VARCHAR2,mgr NUMBER,sal NUMBER,comm NUMBER,deptno NUMBER)

ISBEGIN

INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job,mgr, SYSDATE, sal, comm, deptno);

END hire_employee;PROCEDURE fire_employee (emp_id NUMBER) IS

BEGINDELETE FROM emp WHERE empno = emp_id;

END fire_employee;END emp_actions;

Page 197: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pac k ages e Esc opo

Objetos declarados na Package Specification têm escopo público, podendo ser utilizados fora da packagenome_da_package.nome_do_subprograma (...)nome_da_package.nome_do_tipo

Aqueles objetos definidos somente no Package Body têm escopo privado, podendo somente ser utilizados por outros objetos dentro da package

Page 198: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FUNCTION valor_ok(numero_in IN NUMBER) RETURN BOOLEAN

ISBEGIN

RETURN numero_in > 0;END;

FUNCTION valor_ok(data_in IN DATE) RETURN BOOLEAN

ISBEGIN

RETURN date_in <= SYSDATE;END;

Over loading de Módulos

Dois ou mais módulos podem ter o mesmo nome com uma lista diferente de parâmetros

Page 199: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Over loading de Módulos

Onde Fazer?na seção de declaração de um bloco PL/SQLna seção de declaração de um bloco PL/SQL

dentro de umdentro de um packagepackage

Não podemos fazer a sobrecarga de nomes de programas independentes, muito menos criar dois módulos independentes com o mesmo nome e listas de parâmetros distintas.

Page 200: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo

DECLARETYPE DateTabTyp IS TABLE OF DATE

INDEX BY BINARY_INTEGER;TYPE RealTabTyp IS TABLE OF REAL

INDEX BY BINARY_INTEGER;hiredate_tab DateTabTyp;comm_tab RealTabTyp;indx BINARY_INTEGER;...

BEGINindx := 50;initialize(hiredate_tab, indx); calls first versioninitialize(comm_tab, indx); calls second version...

END;

Page 201: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

In ic ia l izaç ão de Pac k ages

Uma package pode conter um conjunto de instruções a serem executadas somente quando a mesma é carregada para a memória

CREATE OR REPLACE PACKAGE BODY nome_CREATE OR REPLACE PACKAGE BODY nome_pack pack ASAS......BEGINBEGIN

---- Código de inicializaçãoCódigo de inicialização......

END nome_END nome_packpack;;

Page 202: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dependênc ias de Pac k ages

O Package Body depende da Package Specification e dos objetos referenciadosA Package Specification não depende de nadaVisões para dependências no PL/SQL 8.0:

useruser__dependenciesdependencies

allall__dependenciesdependencies

dbadba__dependenciesdependencies

Page 203: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ut i l izaç ão de St ored Func t ions em inst ruç ões SQL

Uma função independente ou contida numa package pode ser chamada numa instrução SQL, dependendo das restrições de referênciaRestrições de Referência: definem quais tipos de estruturas de dados que a função lê ou modifica

WNDS (WNDS (Writes Writes No DatabaseNo Database StateState))RNDS (RNDS (ReadsReads No DatabaseNo Database StateState))WNPS (WNPS (Writes Writes No No Package StatePackage State))RNPS (RNPS (Reads Reads No No Package StatePackage State))

Page 204: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ut i l izaç ão de St ored Func t ions em inst ruç ões SQL

Somente para Stored FunctionsParâmetros

devem ser somente de entradadevem ser somente de entrada

não podem utilizar tipos PL/SQL (não podem utilizar tipos PL/SQL (booleanboolean, , recordrecord))

Tipo de retorno da função também tem que ser um tipo da base de dados

Page 205: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

RESTRICT_REFERENCES

Para funções independentes o PL/SQL consegue determinar as restrições de referência.Para funções em packages é necessário discriminar as restrições através da pragma abaixo. Isto porque os blocos PL/SQL que chamam uma função empacotada dependem apenas da package specification e não do body.

PRAGMA RESTRICT_REFERENCES (nome_função, WNDS PRAGMA RESTRICT_REFERENCES (nome_função, WNDS [,WNPS] [,RNDS] [,RNPS]);[,WNPS] [,RNDS] [,RNPS]);

Page 206: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Algum as Pac k ages Pré-Def in idas

Nome Descrição

DBMS_DDL execução de comandos DDL

DBMS_JOB submete e gerencia jobs programadosdentro do database

DBMS_OUTPUT mostra saídas de programas PL/SQLno terminal

DBMS_SNAPSHOT gerenciamento de snapshots

DBMS_SQL construção de SQLs dinâmicos

UTL_FILE permite que programas PL/SQL leiame escrevam em arquivos

Page 207: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I I .1

Converta o script criado no exercício I .2 (raízes de uma equação do 2o grau) para um procedimento.Armazene este procedimento no banco.

Page 208: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I I .2

Converta o script do exercício I I .1 (três departamentos com maior folha - soma de salários) para um procedimento.Ao invés de mostrar as informações na tela, insira-as em uma tabela.Armazene este procedimento no banco (stored procedure).

Page 209: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I I .3

Converta o script do exercício I I .2 (cálculo do imposto renda) para uma função, que receba como parâmetro a matrícula do funcionário e retorne o imposto a ser pago.Armazene esta função no banco (stored function).

Page 210: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io I I I .4

Construa uma package contendo as funções / procedimentos do departamento pessoal.Armazene esta package no banco de dadosOracle.Salário Líquido = SAL+ COMM - Imposto de RendaCOMM = Se o JOB= CLERK, comissão = 1.03 * SALGravar em Contra-Cheque (salário normal, comissão, imposto de renda e salário Líquido)

Page 211: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr iggers

Page 212: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr iggers

Correspondem a stored procedures, com a diferença que os triggers são disparados automaticamente quando houver operações de insert, update e delete nas tabelas associadas.

Page 213: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr iggers

As aplicações de triggers incluem:cálculo automático de colunascálculo automático de colunas

crítica de transaçõescrítica de transações

garantia de regras de segurança complexasgarantia de regras de segurança complexas

garantia de integridade referencial em bancos garantia de integridade referencial em bancos de dados distribuídosde dados distribuídos

implementação de regras de negócio implementação de regras de negócio complexascomplexas

Page 214: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Sint ax e

CREATE OR REPLACE schema.trigger[BEFORE|AFTER] DELETE OR INSERT OR UPDATE [OF

column]ON schema.table[REFERENCING OLD AS old NEW AS new]FOR EACH ROWWHEN (condition)

pl_sql_block

Page 215: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr igger ing St a t em ent

É a especificação da ação que levará ao acionamento do trigger, podendo ser:

INSERTINSERT

UPDATEUPDATE

DELETEDELETE

Page 216: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr igger Rest r ic t ion

É uma expressão que limita a execução de um trigger.Deve resultar em valor TRUE ou FALSE.O trigger somente será executado para valores TRUE.

Page 217: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr igger Ac t ion

É um bloco PL/SQL que será executado quando o trigger for acionado.

Page 218: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Tr iggers

ROW TRIGGERSsão executados uma vez para cada linha são executados uma vez para cada linha da tabela afetada pelo comando SQL.da tabela afetada pelo comando SQL.

STATEMENT TRIGGERSsão executados apenas uma vez para cada são executados apenas uma vez para cada comando SQL que afete a tabelas, comando SQL que afete a tabelas, independentemente do número de linhas independentemente do número de linhas envolvidas.envolvidas.

Page 219: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ac ionam ent o de Tr iggers

Quando definimos um trigger, podemos especificar quando ele será acionado:

before rowbefore row

before statementbefore statement

after rowafter row

after statementafter statement

Page 220: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr iggers (Ex em plo)

CREATE TRIGGER dummyBEFORE DELETE OR INSERT OR UPDATE ON empFOR EACH ROWWHEN (new.empno > 0)DECLARE

/* variáveis, constantes, cursores, etc. * /BEGIN

/* bloco PL/SQL * /END;

Page 221: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Lim i t e de Tr iggers por Tabela

Um de cada tipo, totalizando até 12 triggers. No entanto no PL/SQL 2.1 uma tabela pode ter mais de um trigger de cada tipo.

BEFORE UPDATEBEFORE UPDATE row row AFTER UPDATEAFTER UPDATE row row BEFORE DELETEBEFORE DELETE row row AFTER DELETEAFTER DELETE row row BEFORE INSERTBEFORE INSERT statement statement AFTER INSERTAFTER INSERT statement statement BEFORE INSERTBEFORE INSERT row row AFTER INSERTAFTER INSERT row row BEFORE UPDATEBEFORE UPDATE statement statement AFTER UPDATEAFTER UPDATE statementstatementBEFORE DELETEBEFORE DELETE statementstatement AFTER DELETEAFTER DELETE statementstatement..

Page 222: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tr iggers ins t ead-of

Em PL/SQL 8.0, podem ser definidos triggers que serão disparados em vez da instrução DML que os disparouSomente para visõesA nível de linhaExemplo:

Para eliminar linhas de uma Para eliminar linhas de uma view view complexacomplexa

Page 223: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Pseudo-reg is t ros

Disponível para triggers a nível de linha:old

valores originais do registro da tabelavalores originais do registro da tabela

somente para leitura no corpo do somente para leitura no corpo do triggertrigger

:newvalores do registro que serão inseridos ou valores do registro que serão inseridos ou atualizados na base de dadosatualizados na base de dados

podem ser atribuídos valores (somente podem ser atribuídos valores (somente quando quando beforebefore))

Page 224: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Cláusula WHEN

Válida para triggers a nível de linhaO corpo do trigger será executado para as linhas que a condição especificada resultar em TRUEOs pseudo-registros :old e :new podem ser utilizados dentro da condição, mas os dois pontos devem ser suprimidos

Page 225: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Predic ados de Tr igger

Usados em triggers disparados para diferentes tipos de instruções de DMLFunções booleanas que identificam a instrução que disparou o trigger

INSERTINGINSERTING

UPDATINGUPDATING

DELETINGDELETING

Page 226: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Trat am ent o de Erros

Page 227: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Conc ei t os

Uma exception é uma situação que não deveria ter ocorrido.Pode ser causada por:

erro gerado pelo sistema (p.e. out oferro gerado pelo sistema (p.e. out ofmemorymemory ))

erro causado por uma ação do usuárioerro causado por uma ação do usuário

aviso gerado pela aplicação e direcionado ao aviso gerado pela aplicação e direcionado ao usuáriousuário

Page 228: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex c ept ion Handlers

Este mecanismo permite separar o código de processamento de erros do resto dos comandos.Oferece um modelo orientado a eventos.Não importa como uma exception foi gerada, ela será tratada na mesma seção (exception section).

Page 229: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Desvio do Flux o

PROCEDURE fluxoIS

novo_valor VARCHAR2(5);BEGIN

novo_valor := valor_antigo || -novo ;IF novo_valor LIKE open%THEN

...END IF;

EXCEPTIONWHEN VALUE_ERRORTHEN ...

END;

Page 230: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Ex c ept ions

Existem quatro tipos de exceptions:exceptionsexceptions do sistema com um nomedo sistema com um nome

geradas devido a um erro no processamento do SGBD ou do código PL/SQL

definidas pelo programador com um nomedefinidas pelo programador com um nomegeradas devido a um erro no código; elas são

declaradas na seção correspondente

Page 231: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Tipos de Ex c ept ions

ExceptionsExceptions do sistema sem um nomedo sistema sem um nomegeradas devido a um erro no processamento do

SGBD ou do código PL/SQL; somente as mais comuns possuem um nome

Definidas pelo programador sem um nomeDefinidas pelo programador sem um nomeprocedimento RAISE_APPLICATION_ERROR é

executadoo programador informa um número (-20000 a

20999) e uma mensagem de erro; utilizada para facilitar a comunicação de erros do

ambiente cliente-servidor.

Page 232: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex c ept ions do s is t em a c om um nom e

DECLAREstmt INTEGER := 1; designates 1st SELECT statement

BEGIN

SELECT ...stmt := 2; designates 2nd SELECT statementSELECT ...

stmt := 3; designates 3rd SELECT statementSELECT ......

EXCEPTIONWHEN NO_DATA_FOUND THEN

INSERT INTO errors VALUES ( Error in statement || stmt);

...END;

Page 233: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex c ept ions Pré-Def in idas

Exception Name Oracle Error SQLCODE ValueCURSOR_ALREADY_OPEN ORA 06511 6511DUP_VAL_ON_INDEX ORA 00001 1INVALID_CURSOR ORA 01001 1001INVALID_NUMBER ORA 01722 1722LOGIN_DENIED ORA 01017 1017NO_DATA_FOUND ORA 01403 +100NOT_LOGGED_ON ORA 01012 1012PROGRAM_ERROR ORA 06501 6501ROWTYPE_MISMATCH ORA 06504 6504STORAGE_ERROR ORA 06500 6500TIMEOUT_ON_RESOURCE ORA 00051 51TOO_MANY_ROWS ORA 01422 1422VALUE_ERROR ORA 06502 6502ZERO_DIVIDE ORA 01476 1476

Page 234: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Def in idas pe lo program ador c om um nom e

Diferente das exceptions pré-definidas, asexceptions definidas pelo programador devem ser declaradas e devem ser chamadas explicitamente através da declaração:

RAISERAISE

Definindo a Exception:DECLAREDECLARE

past_due EXCEPTION;acct_num NUMBER(5);

Page 235: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo

DECLAREpast_due EXCEPTION;acct_num NUMBER;

BEGIN...DECLARE início do sub block

past_due EXCEPTION;acct_num NUMBER;BEGIN

...IF ... THEN

RAISE past_due; esta exception não é executada

END IF;...

END; fim do sub-blockEXCEPTION

WHEN past_due THEN não é usada...

END;

Page 236: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

EXCEPTION_INIT pragm a

Pragma é uma instrução especial ao compiladorA EXCEPTION_INIT pragma indica que o compilador deve associar um nome a umaexception que possui um número correspondente.

Page 237: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

EXCEPTION_INIT pragm a

ExemploORAORA--22922292 violated integrity constrainingviolated integrity constraining -- child child record foundrecord found

DECLAREainda_ha_empreg EXCEPTION;PRAGMA EXCEPTION_INIT (ainda_ha_empreg, -2292);

BEGINDELETE FROM empresa;

EXCEPTIONWHEN ainda_ha_empreg THEN

DBMS_OUTPUT.PUT_LINE( Ainda existem empregados para a empresa );

END;

Page 238: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando ra ise_appl ic at ion_error

A package DBMS_STANDARD, que vem com o Oracle7, tem algumas facilidades que ajudam a aplicação a interagir com oOracle. Por exemplo, a procedure raise_application_error permite ao programador definir uma mensagem de erro ao seu modo.

continua...

Page 239: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando ra ise_appl ic at ion_error

raise_application_error(error_number,message[, {TRUE | FALSE}]);

Onde error_Onde error_numbernumber é um inteiro negativo entre é um inteiro negativo entre --20000 .. 20000 .. --20999 e20999 e messagemessage é uma string de é uma string de caracter com até 2048 bytes. Se o terceiro caracter com até 2048 bytes. Se o terceiro parâmetro é TRUE, o erro é colocado em uma parâmetro é TRUE, o erro é colocado em uma pilha de erros. Se o parâmetro é FALSE (pilha de erros. Se o parâmetro é FALSE (defaultdefault ), ), o erro substitui todos os erros anteriores.o erro substitui todos os erros anteriores.A chamada aA chamada a raiseraise__applicationapplication_error somente _error somente pode ser feita de uma pode ser feita de uma stored procedurestored procedure. Quando . Quando chamada, o subprograma é encerrado e o chamada, o subprograma é encerrado e o número do erro e a mensagem são retornados.número do erro e a mensagem são retornados.

Page 240: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando ra ise_appl ic at ion_error

CREATE PROCEDURE raise_salary (emp_id NUMBER, increase NUMBER) AS

current_salary NUMBER;BEGIN

SELECT sal INTO current_salary FROM emp

WHERE empno = emp_id;IF current_salary IS NULL THEN

/* Issue user defined error message. */

raise_application_error( 20101, Salary is missing );ELSE

UPDATE emp SET sal = current_salary + increase

WHERE empno = emp_id;END IF;

END raise_salary;

Page 241: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Seç ão Ex c ept ion

EXCEPTIONWHEN exception_name1 THEN handler

sequence_of_statements1WHEN exception_name2 THEN another handler

sequence_of_statements2...WHEN OTHERS THEN optional handler

sequence_of_statements3END;

Page 242: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Usando SQLCODE e SQLERRM

No tratamento de uma exception pode-se usar as funções SQLCODE e SQLERRMPara exceptions internas, o número do SQLCODE é negativo a menos que o erro seja no_data_found que neste caso é + 100.O SQLERRM retorna a mensagem doOracle.

Page 243: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo

DECLAREerr_num NUMBER;err_msg VARCHAR2(100);

BEGIN...

EXCEPTION...WHEN OTHERS THEN

err_num := SQLCODE;err_msg := SUBSTR(SQLERRM, 1, 100);INSERT INTO errors VALUES (err_num, err_msg);

END;

Page 244: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io IV.1

Altere o script do exercício I .1, incluindo a seção de exception (prevendo o caso em que o número informado for menor que zero).

Page 245: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io IV.2

Construa um script que faça uma consulta simples à base de dados (tabela scott.emp) tomando como parâmetro o nome do funcionário e retorne a sua matrícula.

Utilize o comando SELECT INTOUtilize o comando SELECT INTO

Pense na possibilidade do funcionário não ser encontradoPense na possibilidade do funcionário não ser encontrado

Pense na possibilidade de existirem dois funcionários com Pense na possibilidade de existirem dois funcionários com o mesmo nomeo mesmo nome

Trate as demaisTrate as demais exceptionsexceptions de uma maneira genéricade uma maneira genérica

Page 246: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex erc íc io IV.3

Converta o script anterior (IV.2 - retorno da matrícula do funcionário dado um nome) para uma procedimento (recebe o nome, retorna a matrícula e um status indicando se fez a recuperação com sucesso, se não encontrou ou se existem registros duplicados).Armazene este procedimento no banco (stored procedure).

Page 247: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Test es e Depuraç ão

Page 248: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Diret r izes de Depuraç ão

Encontrar o local onde ocorre o erroDefinir exatamente o problemaReduzir o programa a um simples testeEstabelecer um ambiente de teste

Page 249: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_OUTPUT

Pacote para mostrar mensagensProcedure Descrição

enable Habilita o buffer de mensagens.No SQL*Plus pode-se usar SET SERVEROUTPUT ON

disable Desabilita o buffer de mensagensput_line Imprime uma linha no bufferget_line Obtém uma linha do buffer (dentro do bloco PL/SQL)get_lines Obtém todas as linhas do buffer (dentro do bloco PL/SQL)

Page 250: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo de DBMS_OUTPUT

BEGINDBMS_OUTPUT.ENABLE(20000);DBMS_OUTPUT.PUT_LINE( Início );...DBMS_OUTPUT.PUT_LINE( Fim );

END;

Page 251: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Proc edure Bui lder

Ambiente de desenvolvimento de PL/SQLServe como depurador de código PL/SQLNão pode depurar stored procedures, somente chamar

Page 252: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PL/SQL In t erpret er

VisualizadorMostra o bloco, procedimento ou função que Mostra o bloco, procedimento ou função que está sendo executadoestá sendo executado

Linha de comandosPermite execução imediata de instruções de Permite execução imediata de instruções de PL/SQLPL/SQL

Page 253: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Fac i l idades

Depurar sem necessidade de alterar o código

Inserção de Inserção de breakpointsbreakpoints

Visualização e alteração dos valores das Visualização e alteração dos valores das variáveis locaisvariáveis locais

Depuração mais simplesAmbiente de desenvolvimento integrado

Page 254: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PL/SQL Dinâm ic o

Page 255: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL

A instrução SQL pode ser montada dinamicamente dentro do blocoProcessa três tipos de instruções

instruções de DML e DDLinstruções de DML e DDLconsultasconsultasblocos de PL/SQL anônimosblocos de PL/SQL anônimos

Instruções SELECT não devem possuir a cláusula INTONão incluir ponto e vírgula no final, exceto blocos PL/SQL anônimos

Page 256: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.OPEN_CURSOR

Abre o cursor para executar a instrução SQL atribuindo um ID para o cursor que será utilizado nas chamadas subsequentes.Sintaxe:FUNCTION OPEN_CURSOR RETURN INTEGER;

Page 257: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.PARSE

Análise da instruçãoVerificação da sintaxe e semântica da Verificação da sintaxe e semântica da instruçãoinstruçãoSe for uma consulta, determina o plano de Se for uma consulta, determina o plano de execuçãoexecução

SintaxePROCEDURE PARSE (cursor_id IN INTEGER,

instrução IN VARCHAR2,indicador_linguagem IN

INTEGER);

onde onde indicador_linguagemindicador_linguagem pode serpode ser V6, V7 ou V6, V7 ou NATIVE.NATIVE.

Page 258: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.BIND_VARIABLE

Associação de variáveis de entrada de dados à variáveis reais do bloco PL/SQLSintaxePROCEDURE BIND_VARIABLEPROCEDURE BIND_VARIABLE

(cursor_id IN INTEGER,(cursor_id IN INTEGER,:nome_na_instrução IN :nome_na_instrução IN

VARCHAR2,VARCHAR2,valor_para_atribuir IN valor_para_atribuir IN tipo_dadotipo_dado););

onde tipo_dado pode ser NUMBER, onde tipo_dado pode ser NUMBER, VARCHAR2 ou DATE.VARCHAR2 ou DATE.

Há variações para os demais tipos de dado

Page 259: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.DEFINE_COLUMN

Associação de variáveis de saída de dados (resultado de uma consulta) à variáveis reais do bloco PL/SQLSintaxePROCEDURE DEFINE_COLUMN

(cursor_id IN INTEGER,posição_coluna IN INTEGER,nome_coluna IN tipo_dado);

Uma instrução para cada coluna da consulta

Page 260: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.EXECUTE

Para não consultaexecuta a instrução e retorna o número de executa a instrução e retorna o número de linhas processadaslinhas processadas

Para consultadetermina o conjunto de linhas a serem determina o conjunto de linhas a serem processadasprocessadas

SintaxeFUNCTION EXECUTE (cursor_id IN INTEGER)

RETURN INTEGER;O retorno corresponde às linhas processadas O retorno corresponde às linhas processadas somente se forem instruções INSERT, somente se forem instruções INSERT, UPDATE ou DELETE.UPDATE ou DELETE.

Page 261: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.FETCH_ROWS

Somente usado em consultasFaz o fetch buscando os dados no servidorOs dados de retorno são convertidos nos tipos definidos com DEFINE_COLUMNSintaxeFUNCTION FETCH_ROWS (cursor_id IN INTEGER)

RETURN INTEGER;

O retorno é o número de linhas.O retorno é o número de linhas.

Page 262: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.EXECUTE_AND_FETCH

Combina as operações de EXECUTE e a primeira chamada de FETCH_ROWSSintaxeFUNCTION EXECUTE_AND_FETCH

(cursor_id IN INTEGER,busca_exata IN BOOLEAN DEFAULT FALSE)RETURN INTEGER;

Se Se busca_exatabusca_exata for TRUE e a consulta retornar for TRUE e a consulta retornar mais de uma linha, abre a mais de uma linha, abre a exception exception TOO_MANY_ROWS.TOO_MANY_ROWS.O retorno é o número de linhas.O retorno é o número de linhas.

Page 263: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.VARIABLE_VALUE

Determina o valor de uma variável de associação, se for modificada pela instrução (parâmetros de saída)Utilizado quando a instrução é um bloco PL/SQLSintaxePROCEDURE VARIABLE_VALUE

(cursor_id IN NUMBER,:nome_na_instrução IN VARCHAR2,valor_variavel OUT tipo_dado);

Page 264: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.COLUMN_VALUE

Somente usado em consultas, após FETCH_ROWS

Devolve realmente os dadosVariáveis devem ser do mesmo tipo definido em DEFINE_COLUMN

SintaxePROCEDURE COLUMN_VALUE

(cursor_id IN INTEGER,posição_coluna IN INTEGER,valor_coluna OUT tipo_dado);

Page 265: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

DBMS_SQL.CLOSE_CURSOR

Fecha o cursorLibera os recursos utilizados pelo cursorSintaxePROCEDURE CLOSE_CURSOR

(cursor_id IN OUT INTEGER)

Page 266: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex ec ut ar ins t ruç ões DML (ex c et o c onsul t as)

Passos necessários:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)

Analisar a instrução (PARSE)Analisar a instrução (PARSE)

Associar quaisquer variáveis de entrada de Associar quaisquer variáveis de entrada de dados (BIND_VARIABLE)dados (BIND_VARIABLE)

Executar a instrução (EXECUTE)Executar a instrução (EXECUTE)

Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

Page 267: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex ec ut ar ins t ruç ões DDL

Passos necessários:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)

Analisar a instrução (PARSE)Analisar a instrução (PARSE)

Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

Não pode utilizar bind variables em DDLAs instruções são executadas já no PARSE, não necessitando, assim, de EXECUTE

Page 268: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex ec ut ar c onsul t as

Passos necessários:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)Analisar a instrução (PARSE)Analisar a instrução (PARSE)Associar quaisquer variáveis de entrada de dados Associar quaisquer variáveis de entrada de dados (BIND_VARIABLE)(BIND_VARIABLE)Definir variáveis de saída de dados Definir variáveis de saída de dados (DEFINE_COLUMN)(DEFINE_COLUMN)Executar a consulta (EXECUTE)Executar a consulta (EXECUTE)Extrair as linhas (FETCH_ROWS)Extrair as linhas (FETCH_ROWS)Devolver os resultados às variáveis PL/SQL Devolver os resultados às variáveis PL/SQL (COLUMN_VALUE)(COLUMN_VALUE)Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

Page 269: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex ec ut ar PL/SQL

Passos necessários:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)Analisar a instrução (PARSE)Analisar a instrução (PARSE)Associar quaisquer variáveis de entrada de Associar quaisquer variáveis de entrada de dados (BIND_VARIABLE)dados (BIND_VARIABLE)Executar a instrução (EXECUTE)Executar a instrução (EXECUTE)Obter o valor de quaisquer variáveis de saída Obter o valor de quaisquer variáveis de saída de dados (VARIABLE_VALUE)de dados (VARIABLE_VALUE)Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

Page 270: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Novas fac i l idades PL/SQL 8.0

Capacidade de analisar cadeias de caracteres de SQL de grandes dimensõesProcessamento matricialAssociar e definir tipos Oracle8 (objetos, LOBs)Procedimento DESCRIBE_COLUMNS

Page 271: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Sugest ões e Téc nic as

Reutilizar cursoresUm cursor aberto pode processar instruções Um cursor aberto pode processar instruções SQL diferentesSQL diferentesInstruções repetidas não necessitam repetir o Instruções repetidas não necessitam repetir o PARSE, apenas o EXECUTEPARSE, apenas o EXECUTE

PermissõesOs perfis de grupo são desativados em Os perfis de grupo são desativados em procedimentos empacotados, incluindo o procedimentos empacotados, incluindo o DBMS_SQLDBMS_SQL

Operações de DDL e lock

Page 272: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ent rada e Saída em Arquivos

Page 273: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PL/SQL I /O em Arquivos OS

A release 7.3 do Oracle Server adiciona a capacidade de se fazer I /O através da packageUTL_FILE.Isto é similar àquelas operações padrões em arquivos de sistemas operacionais (OPEN, GET, PUT, CLOSE) com algumas limitações.Por exemplo, pode-se chamar a função FOPEN para retornar um arquivo aberto, no qual as chamadas subsequentes aos comandos GET_LINE ou PUT são executados nos arquivos. Enquanto não se fechar o arquivo (FCLOSE) as operações de I /O não estarão completas.

Page 274: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Proc edures da Pac k age UTL_FILE

Function/Procedure Description FOPEN Abre um arquivo para entrada e saída

Cria um arquivo de saída se ele não existirIS_OPEN Determina se um arquivo está abertoFCLOSE Fecha um arquivoFCLOSE_ALL Fecha todos os arquivos abertosGET_LINE Lê uma linha texto de um arquivo aberto. PUT Escreve uma linha no arquivo.

Não adiciona um caracter de terminação (EOL)PUT_LINE Escreve uma linha no arquivo.

Adiciona um caracter de terminaçãoPUTF Procedure com formatação.NEW_LINE Escreve uma ou mais linhas de terminação no arquivo.FFLUSH Escreve fisicamente todas as linhas pendentes para

o arquivo de saída.

Page 275: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Seguranç a

O diretório de acesso dos arquivos deve ser especificado em um parâmetro de inicialização no arquivo INIT.ORA

UTL_FILE_DIR = <UTL_FILE_DIR = < directory namedirectory name>>

A especificação do parâmetro:UTL_FILE_DIR = *UTL_FILE_DIR = *

torna sem efeito a segurança

Page 276: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Dec laraç ão de T ipos

A especificação para a package UTL_FILE é declarada no tipo:

TYPE file_TYPE file_typetype IS RECORD (id IS RECORD (id BYNARY_INTEGER)BYNARY_INTEGER)

Exemplo:Exemplo:v_filehandle UTL_FILE.FILE_TYPE;

...v_filehandle := UTL_FILE.FOPEN(...);...

Page 277: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex c ept ions

Exception Name DescriçãoINVALID_PATH Localização ou nome do arquivo inválidoINVALID_MODE Modo de abertura do arquivo inválido.INVALID_FILEHANDLE Arquivo Inválido.INVALID_OPERATION Arquivo não pode ser aberto.READ_ERROR Um erro de sistema operacional

ocorreu durante leitura.WRITE_ERROR Um erro de sistema operacional ocorreu

durante a escrita..INTERNAL_ERROR Um erro não especificado ocorreu no PL/SQL.

Page 278: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FOPEN

Sintaxe:FUNCTION FOPEN(location IN VARCHAR2,

filename IN VARCHAR2,open_mode IN

VARCHAR2)RETURN UTL_FILE.FILE_TYPE;

Page 279: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FOPEN

Parâmetros Descriçãolocation Diretóriofilename Nome do Arquivoopen_mode r ler um texto (GET_LINE)

w escrever um texto (PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH) a adicionar um texto (PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH)

Page 280: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ret orno da Funç ão FOPEN

FOPEN retorna um file handle que deve ser passado para todas as procedureschamadas posteriormente.

Page 281: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

IS_OPEN

Sintaxe:FUNCTION IS_OPEN(file_handle IN

FILE_TYPE)RETURN BOOLEAN;

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPEN

Page 282: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FCLOSE

Sintaxe:PROCEDURE FCLOSE (file_handle IN OUT

FILE_TYPE);

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPEN

Page 283: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FCLOSE_ALL

Sintaxe:PROCEDURE FCLOSE_ALL;

Page 284: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

GET_LINE

Sintaxe:PROCEDURE GET_LINE

(file_handle IN FILE_TYPE,buffer OUT VARCHAR2);

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPENbuffer Um buffer para receber a linha lida do arquivo.

Page 285: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PUT

Sintaxe:PROCEDURE PUT

(file_handle IN FILE_TYPE,buffer IN VARCHAR2);

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPENbuffer Um buffer que contém a linha a ser escrita.

Page 286: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

NEW_LINE

Sintaxe:PROCEDURE NEW_LINE

(file_handle IN FILE_TYPE,lines IN NATURAL := 1);

Parametro Descriçãofile_handle Um file handle ativo retornado na função FOPENlines Número de linhas de terminação a serem

escritas no arquivo.

Page 287: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

PUT_LINE

Sintaxe:PROCEDURE PUT_LINE

(file_handle IN FILE_TYPE,buffer IN VARCHAR2);

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPENbuffer Um buffer que contem a linha a ser escrita.

Page 288: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

FFLUSH

Sintaxe:PROCEDURE FFLUSH

(file_handle IN FILE_TYPE);

Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPEN

Page 289: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ex em plo

PROCEDURE file_to_table(loc_in IN VARCHAR2, file_in IN VARCHAR2,

table_in IN names_tabtype)IS

names_file CONSTANT UTL_FILE.FILE_TYPE :=UTL_FILE.FOPEN (loc_in, file_in, R);

line_counter INTEGER := 1;BEGIN

LOOPUTL_FILE.GET_LINE(names_file,

table_in(line_counter));line_counter := line_counter + 1;

END LOOP;EXCEPTION

WHEN NO_DATA_FOUNDTHEN

UTL_FILE.FCLOSE(names_file);END;

Page 290: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Desem penho e Ot im izaç ão

Page 291: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ins t ânc ia Orac le

SGA: Sistem Global AreaShared Pool

Armazena instruções SQL recebidas do BDArmazena instruções SQL recebidas do BD

TriggersTriggersmanter o código o mais pequeno possível, através

de chamadas de subprogramas armazenadosantes da versão 7.3 os triggers não eram

armazenados de forma compilada

Page 292: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ot im izaç ão de inst ruç ões SQL

Explain PlanTabela Tabela planplan__tabletable

Pode ser criada localmente através de $ORACLE_HOME\rdbms\admin\utlxplan.sql

No SQL*No SQL* PlusPlusSET AUTOTRACE ONApós cada instrução faz automaticamente o

explain plan

Page 293: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Ot im izaç ão de inst ruç ões SQL

TkprofALTER SESSION SET SQL_TRACE= TRUEALTER SESSION SET SQL_TRACE= TRUE

gera um arquivo de log de todas as instruções SQL, no formato ora_nnnnn.trc

Após todos os comandos efetuados, fechar o Após todos os comandos efetuados, fechar o arquivo de arquivo de loglog, alterando para FALSE, alterando para FALSE

Executar Executar tkprof tkprof para formatar o arquivo .para formatar o arquivo .trctrc

Page 294: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Anál ise de Resul t ados

NESTED LOOPOperação necessária para executar os Operação necessária para executar os joins joins de tabelasde tabelas

TABLE ACCESS (FULL)Pesquisa integral, buscando todas as linhas Pesquisa integral, buscando todas as linhas da tabelada tabela

TABLE ACCESS (BY ROWID)Modo mais rápido de buscar uma só linhaModo mais rápido de buscar uma só linha

INDEX: { UNIQUE | RANGE} SCANINDEX: { UNIQUE | RANGE} SCAN

Page 295: Programação em PL/SQL · PDF fileEstrutura do Curso Introdução a PL/SQL ... (p.e.Oracle Forms). Adiciona construções de programação não existentes na linguagem de banco de

Téc nic as

Verificar questões de redeUtilizar PL/SQL no Client sempre que possívelEvitar repetições de parse desnecessáriasInterface matricial Oracle

permite grandes quantidades de dados permite grandes quantidades de dados enviados pela rede como uma unidadeenviados pela rede como uma unidade