Program aç ão em PL/SQL
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
Est rut ura do Curso
SQL em PL/SQLFunções de SQL integradasCursoresProcedimentos e FunçõesPackagesTriggersTratamento de Erros
Est rut ura do Curso
Testes e DepuraçãoPL/SQL DinâmicoEntrada e Saída em ArquivosDesempenho e Otimização
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.
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
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
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
Conc ei t os Básic os daLinguagem PL/SQL
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
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
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
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
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.
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
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;
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 * /
......
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
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).
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;
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;
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;
Var iáveis e Dados de Program a
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
Tipos de Dados
Número BINARY_INTEGERDECDECIMALDOUBLE PRECISIONFLOATINTINTEGERNATURALNUMBERPOSITIVEREALSMALLINT
Caractere CHARCHARACTERLONGLONG RAWRAWROWIDSTRINGVARCHARVARCHAR2
Boleano BOOLEANData-hora DATE
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)
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á.
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.
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
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)
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.
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
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
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
Booleano (BOOLEAN)
Tipo de dados lógico (não existe correspondente no servidor Oracle).Pode assumir os valores TRUE, FALSE ou NULL.
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.
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
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
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
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]
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
Cont ro le Condic ional e Sequenc ia l
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.
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;
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;
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;
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.
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.
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.
SQL* Plus
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
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;
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)
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.
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;
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
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
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
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
Loops
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.
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>
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;
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
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
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
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;
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.
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
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;
Regis t ros em PL/SQL
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.
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
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;
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) );
Tabelas PL/SQL
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, )
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.
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;
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;
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;
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;
At r ibut os de Tabela: COUNT
Retorna o número de elementos na tabela.
...IF ename_tab.COUNT = 50 THEN
...END;
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
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;...
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.
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;
SQL em PL/SQL
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)
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
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
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;
DML: Updat e
Altera o conteúdo de uma ou mais linhas de uma tabelaUPDATE empSET sal = sal * 1.2WHERE empno = 1;
DML: Delet e
Elimina uma ou mais linhas de uma tabelaDELETE FROM emp
WHERE empno = 1;
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
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
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;
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
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;
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.
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;
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)
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
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]
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
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
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
Funç ões de SQL in t egradas
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
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
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
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
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
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
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.
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
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
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);
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
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
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
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
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
Cursores
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;;
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.
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.
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
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
Dec laraç ão
CURSOR nome_cursor [ ( [ parâmetro [ , parâmetro ...] ) ][ RETURN especificação_retorno ]IS comando_SELECT;
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);
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
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
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;
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
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.
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;;
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.
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
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;......
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;
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;
At r ibut os de Cursores
%ISOPENIF NOTIF NOT empemp__curcur%ISOPEN THEN%ISOPEN THEN
OPENOPEN empemp__curcur;;END IF;END IF;
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
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)
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
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;;
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.
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.
Var iáve is Cursores
OPEN cursorOPEN cursor
FETCH reg1FETCH reg1
CLOSE cursorCLOSE cursor
FETCH reg2FETCH reg2
FETCH reg3FETCH reg3
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;
......
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;
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;
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;
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
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;
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
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;
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
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
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
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.
Subprogram as:Proc edim ent os e Funç ões
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
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
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
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;
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;
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
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];
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);
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;
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;
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]
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 ...
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;
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.
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;
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
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
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;
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 );
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
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:
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
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
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
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.
Pac k ages
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
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
In t er fac e
Aplicação
Body
Especificação
DataBasePackage
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] ;
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] ;
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;
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;
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
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
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.
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;
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;;
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
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))
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
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]);
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
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.
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).
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).
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)
Tr iggers
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.
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
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
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
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.
Tr igger Ac t ion
É um bloco PL/SQL que será executado quando o trigger for acionado.
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.
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
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;
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..
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
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))
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
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
Trat am ent o de Erros
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
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).
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;
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
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.
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;
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
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);
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;
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.
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;
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...
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.
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;
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;
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.
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;
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).
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
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).
Test es e Depuraç ão
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
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)
Ex em plo de DBMS_OUTPUT
BEGINDBMS_OUTPUT.ENABLE(20000);DBMS_OUTPUT.PUT_LINE( Início );...DBMS_OUTPUT.PUT_LINE( Fim );
END;
Proc edure Bui lder
Ambiente de desenvolvimento de PL/SQLServe como depurador de código PL/SQLNão pode depurar stored procedures, somente chamar
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
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
PL/SQL Dinâm ic o
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
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;
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.
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
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
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.
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.
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.
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);
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);
DBMS_SQL.CLOSE_CURSOR
Fecha o cursorLibera os recursos utilizados pelo cursorSintaxePROCEDURE CLOSE_CURSOR
(cursor_id IN OUT INTEGER)
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)
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
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)
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)
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
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
Ent rada e Saída em Arquivos
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.
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.
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
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(...);...
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.
FOPEN
Sintaxe:FUNCTION FOPEN(location IN VARCHAR2,
filename IN VARCHAR2,open_mode IN
VARCHAR2)RETURN UTL_FILE.FILE_TYPE;
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)
Ret orno da Funç ão FOPEN
FOPEN retorna um file handle que deve ser passado para todas as procedureschamadas posteriormente.
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
FCLOSE
Sintaxe:PROCEDURE FCLOSE (file_handle IN OUT
FILE_TYPE);
Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPEN
FCLOSE_ALL
Sintaxe:PROCEDURE FCLOSE_ALL;
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.
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.
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.
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.
FFLUSH
Sintaxe:PROCEDURE FFLUSH
(file_handle IN FILE_TYPE);
Parâmetro Descriçãofile_handle Um file handle ativo retornado na função FOPEN
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;
Desem penho e Ot im izaç ão
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
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
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
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
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