apostila prog pl sql
Post on 18-Oct-2015
119 Views
Preview:
DESCRIPTION
TRANSCRIPT
-
5/28/2018 Apostila Prog PL SQL
1/295
Programao em PL/SQL
-
5/28/2018 Apostila Prog PL SQL
2/295
Estrutura do Curso
Introduo a PL/SQLConceitos Bsicos de PL/SQLVariveis e Dados de ProgramaControle Condicional e SequencialLoopsRegistros em PL/SQLTabelas PL/SQL
-
5/28/2018 Apostila Prog PL SQL
3/295
Estrutura do Curso
SQL em PL/SQLFunes de SQL integradasCursoresProcedimentos e FunesPackagesTriggersTratamento de Erros
-
5/28/2018 Apostila Prog PL SQL
4/295
Estrutura do Curso
Testes e DepuraoPL/SQL DinmicoEntrada e Sada em ArquivosDesempenho e Otimizao
-
5/28/2018 Apostila Prog PL SQL
5/295
PL/SQL
Procedural Language extensions to SQL.Usamos esta linguagem no Oracle Servere em aplicaes-cliente (p.e. OracleForms).Adiciona construes de programao no
existentes na linguagem de banco dedados padro.Permite a combinao de comandos SQL
com construes procedurais.
-
5/28/2018 Apostila Prog PL SQL
6/295
Verses do PL/SQL
Verso 2.0 - Oracle 7.0
Verso 2.1 - Oracle 7.1
Verso 2.2 - Oracle 7.2
Verso 2.3 - Oracle 7.3Verso 8.0 - Oracle 8.0
Verso 1.1 -
Developer/2000
Verso 8.0 -
Developer 6
Cliente Servidor
-
5/28/2018 Apostila Prog PL SQL
7/295
Arquitetura do PL/SQL
Oracle Forms
Gerador
de SQL
Programa
PL/SQL local
PL/SQL V8.0
Runtime Engine
Oracle Server
Processador
de comandos
SQL
Stored Program Unit
PL/SQL V8.0
Runtime Engine
-
5/28/2018 Apostila Prog PL SQL
8/295
Ambientes de Execuo
ServidorOracleOracle 7: PL/SQL verso 27: PL/SQL verso 2
OracleOracle 8: PL/SQL verso 88: PL/SQL verso 8SQL*SQL* PlusPlus (modo interativo)(modo interativo)
Cliente
Oracle DeveloperOracle Developer ((FormsForms,, ReportsReports eeProcedure BuilderProcedure Builder))
utilizam compiladores PL/SQL prprios
-
5/28/2018 Apostila Prog PL SQL
9/295
Conceitos Bsicos daLinguagem PL/SQL
-
5/28/2018 Apostila Prog PL SQL
10/295
Charac t er Set do PL/SQL
Tipo Caracteres
Letras A-Z, a-zDgitos 0-9
Smbolos ~ ! @ # $ % & * ( ) _- + = | [ ] { } : ; < >, . ? /
Espao em Branco Tab, espao, Enter
-
5/28/2018 Apostila Prog PL SQL
11/295
Charac t er Set do PL/SQL
O PL/SQL no uma linguagem sensvelao contexto.
letras maisculas so tratadas da mesmaletras maisculas so tratadas da mesmamaneira que minsculas, a no ser no casomaneira que minsculas, a no ser no casodestas pertencerem a uma cadeia dedestas pertencerem a uma cadeia decaracteres.caracteres.
I f x < > s thenIf x < > S then
-
5/28/2018 Apostila Prog PL SQL
12/295
Smbolos Simples e Compostos
S m b olo D escr i o
; te rm in ad o r d e co m and o s
% in d icad o r d e a trib u to (p .e .%ISOPEN) ; s mbo lo w ildca rd
_ sm b o lo w ildca rd: in d icad o r d e v ariv e l h o sp ed eira
* * 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 ao
< < e > > d e lim itad o r d e r tu lo
< = e > = m e no r o u igu al e m a io r o u igu al:= o p erad o r d e a trib u io
= > o p erad o r d e asso c iao p a rano tao pos ic ional
-- 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 trio
-
5/28/2018 Apostila Prog PL SQL
13/295
Charac t er Set do PL/SQL
Caracteres so agrupados, formandounidades lxicas, que so os menores
componentes individuais da linguagem.Uma unidade lxica pode formar:
identificadoresidentificadores
literaisliteraisdelimitadoresdelimitadores
comentrioscomentrios
-
5/28/2018 Apostila Prog PL SQL
14/295
Iden t i f i cadores
Identificador um nome para um objetoPL/SQL.
constante, varivel,constante, varivel, exceptionexception, procedimento,, procedimento,funo,funo, packagepackage, registro, tabela PL/SQL, cursor, registro, tabela PL/SQL, cursore palavra reservada.e palavra reservada.
At 30 caracteres.
Tem que comear com uma letra.Pode incluir $, _ e # .No pode conter espaos.
-
5/28/2018 Apostila Prog PL SQL
15/295
L i te ra is
Literal um valor no representado porum identificador; simplesmente um
valor.Nmero
415, 21.6 ou NULL415, 21.6 ou NULL
StringEsta uma frase , 01Esta uma frase , 01--0303--97 ou NULL97 ou NULL
Boolean
TRUE, FALSE ou NULLTRUE, FALSE ou NULL
-
5/28/2018 Apostila Prog PL SQL
16/295
Del imi tadores
Delimitador Ponto e vrgula (;)Indica o final de um comandoIndica o final de um comandoIF salario < min_salarioTHEN
salario := salario + salario * .25;END IF;
-
5/28/2018 Apostila Prog PL SQL
17/295
Comentr ios
Comentrio de uma nica linhaIFIF salariosalario < min_< min_salariosalario(1994)(1994) ---- retorna min salrio do anoretorna min salrio do ano
THENTHENsalariosalario :=:= salariosalario * .25;* .25;
END IF;END IF;
Comentrio de mltiplas linhas
PROCEDURE 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 Responsvel: Manoel de Souza * /Analista Responsvel: Manoel de Souza * /
......
-
5/28/2018 Apostila Prog PL SQL
18/295
Estrutura de um Bloco
A estrutura da linguagem PL/SQL orientada a blocos
Modularizaoum bloco a unidade bsica de trabalho daum bloco a unidade bsica de trabalho daqual procedimentos e funes so construdosqual procedimentos e funes so construdos
Escopoo bloco oferece um escopo ou contexto parao bloco oferece um escopo ou contexto paraobjetos logicamente relacionadosobjetos logicamente relacionados
-
5/28/2018 Apostila Prog PL SQL
19/295
Sees de um BlocoCabealho (Header)
determina o modo como o bloco deve ser chamadodetermina o modo como o bloco deve ser chamado
Seo de Declaraoonde declaramos variveis, cursores e subonde declaramos variveis, cursores e sub--blocos eblocos esees de exceosees de exceo
Seo de Execuo
parte que contm o cdigo a ser executadoparte que contm o cdigo a ser executadoSeo de Excees (Exceptions)
manipula excees ao processamento normalmanipula excees ao processamento normal(condies de aviso e erro).(condies de aviso e erro).
-
5/28/2018 Apostila Prog PL SQL
20/295
Sees de um Bloco
CabealhoCabealho
IS
Seo de DeclaraoSeo de Declarao
BEGIN
Seo de ExecuoSeo de Execuo
EXCEPTION
Seo deExceptionsSeo deExceptions
END;
-
5/28/2018 Apostila Prog PL SQL
21/295
Sees de um Bloco
Blocos AnnimosNo possuem nomeNo possuem nome DECLARE
Seo de DeclaraoSeo de Declarao
BEGIN
Seo de ExecuoSeo de Execuo
EXCEPTION
Seo deExceptionsSeo deExceptions
END;
-
5/28/2018 Apostila Prog PL SQL
22/295
Blocos Aninhados
Um bloco pode conter um ou maissub-blocos de cdigo.
As variveis dos blocosAs variveis dos blocosexternos podem serexternos podem serreferenciadas nosreferenciadas nosblocos internos, pormblocos internos, porm
no o contrrio.no o contrrio.
PROCEDURE calcula_totaisIS
total_ano NUMBER;
BEGIN
total_ano := 0;
DECLARE
total_ms NUMBER;BEGIN
total_ms := total_ano / 12;
END;
END;
-
5/28/2018 Apostila Prog PL SQL
23/295
Variveis eDados de Programa
-
5/28/2018 Apostila Prog PL SQL
24/295
Var iveis
Atributos de uma varivelnome, tipo e valornome, tipo e valor
NomePode ter at 30 caracteresPode ter at 30 caracteres
Tem que comear com uma letraTem que comear com uma letra
ConstanteTipo especial de varivelTipo especial de varivel
Valor constanteValor constante
-
5/28/2018 Apostila Prog PL SQL
25/295
Tipos de Dados
Nmero BINARY_INTEGER
DEC
DECIMAL
DOUBLE PRECISIONFLOAT
INT
INTEGER
NATURAL
NUMBER
POSITIVEREAL
SMALLINT
Caractere CHAR
CHARACTER
LONG
LONG RAWRAW
ROWID
STRING
VARCHAR
VARCHAR2Boleano BOOLEAN
Data-hora DATE
-
5/28/2018 Apostila Prog PL SQL
26/295
Tipos de Dados
Existem no banco de dados: Number, Char,Long, Long Raw, Raw, Rowid, Varchar2, Date.
Binary_Integer: Utilizado para armazenarinteiros com sinal. Com intervalo de:-2147483647 .. 2147483647
Subtipos:Natural (de 0 .. 2147483647)Positive (de 1 .. 2147483647)
-
5/28/2018 Apostila Prog PL SQL
27/295
Tipos de Dados NumricosUtilize NUMBER para armazenar nmeros(inclusive ponto-flutuante)
Preciso Mxima: 38 dgitos1.0E1.0E--129 at 9.999E125129 at 9.999E125Declarao de uma varivel numrica:
NUMBER ( preciso, escala )NUMBER ( preciso, escala )
preciso: nmero total de dgitospreciso: nmero total de dgitosescala: nmero de dgitos a direita ouescala: nmero de dgitos a direita ouesquerda do ponto decimal em que oesquerda do ponto decimal em que oarredondamento ocorrer.arredondamento ocorrer.
-
5/28/2018 Apostila Prog PL SQL
28/295
Tipos de Dados Numricos
Se a escala positiva, ento a escaladetermina que o ponto onde oarredondamento ocorre est a direita do ponto
decimal.Se a escala negativa, ento a escaladetermina que o ponto onde oarredondamento ocorre est a esquerda doponto decimal.Se a escala zero, ento o arredondamentoocorre para a parte inteira do nmero.Se a escala no especificada, ento oarredondamento no ocorre.
-
5/28/2018 Apostila Prog PL SQL
29/295
VALOR FORMATO RESULTADO
12345.6784 NUMBER(10,3) 12345.678
1234567891.23 NUMBER(10,3) ERROR
1567899 NUMBER(10,-6) 2000000
53.35 NUMBER(10,-6) 0
EXEMPLO:
Tipos de Dados Num r ic os - Ex em plos
-
5/28/2018 Apostila Prog PL SQL
30/295
Subt ipos Numr icos
Pr-def inidos
Subtipo Compatibilidade Correspondente no
Oracle
DEC (prec, esc) ANSI NUMBER(prec, esc)DECIMAL(prec, esc) IBM NUMBER(prec, esc)
DOUBLE
PRECISION
ANSI NUMBER
FLOAT ANSI, IBM NUMBER
INT ANSI NUMBER(38)INTEGER ANSI, IBM NUMBER(38)
REAL ANSI NUMBER
SMALLINT ANSI, IBM NUMBER(38)
-
5/28/2018 Apostila Prog PL SQL
31/295
Carac teresCHAR
Subtipos:Subtipos: CharacterCharacter e string.e string.
especifica que a varivel tem um tamanho fixoespecifica que a varivel tem um tamanho fixopodepode--se especificar o tamanho mximo (1 atse especificar o tamanho mximo (1 at32767)32767)
se o tamanho no for especificado, o valor padrose o tamanho no for especificado, o valor padro
1 (um). 1 (um).espaos em branco so adicionados ao final daespaos em branco so adicionados ao final davarivel, se esta armazenar uma cadeia devarivel, se esta armazenar uma cadeia decaracteres de tamanho menor que o mximo.caracteres de tamanho menor que o mximo.
-
5/28/2018 Apostila Prog PL SQL
32/295
Carac teres
VARCHAR2 e VARCHARarmazenam cadeias de caractere de tamanhoarmazenam cadeias de caractere de tamanho
varivel.varivel.podepode--se especificar o tamanho mximo (1 atse especificar o tamanho mximo (1 at32767)32767)
VARCHAR2 e VARCHAR so sinnimosVARCHAR2 e VARCHAR so sinnimos(visando a compatibilidade com bancos de(visando a compatibilidade com bancos dedados ANSI).dados ANSI).
Recomendao daRecomendao da OracleOracle: utilize VARCHAR2: utilize VARCHAR2
-
5/28/2018 Apostila Prog PL SQL
33/295
Carac teres
LONGarmazenam cadeias de caractere de tamanhoarmazenam cadeias de caractere de tamanho
varivel, de at 32760 caracteres.varivel, de at 32760 caracteres.recomendao: utilize VARCHAR2.recomendao: utilize VARCHAR2.
RAWarmazena dados binrios de at 32767 bytesarmazena dados binrios de at 32767 bytes
o PL/SQL no tenta interpretar os dadoso PL/SQL no tenta interpretar os dados
LONG RAWarmazena dados binrios de at 32760 bytesarmazena dados binrios de at 32760 bytes
-
5/28/2018 Apostila Prog PL SQL
34/295
Rowid
No database Oracle, ROWID umapseudocoluna, pertencente a toda tabela.
Internamente gerado, ocupando 6 bytes.ROWID em PL/SQL um subtipo do CHARcom tamanho fixo.
BBBBBBB.RRRR.FFFFbloco no database file, linha no bloco ebloco no database file, linha no bloco edatabase filedatabase file
-
5/28/2018 Apostila Prog PL SQL
35/295
Booleano (BOOLEAN)
Tipo de dados lgico (no existecorrespondente no servidor Oracle).
Pode assumir os valores TRUE, FALSE ouNULL.
-
5/28/2018 Apostila Prog PL SQL
36/295
Data-hora (DATE)
Uma varivel do tipo DATE armazena tantoinformaes sobre data quanto sobre hora.Valor de tamanho fixo, que ocupa 7 bytes.DATE armazena as seguintes informaes:
sculo, ano, ms, dia, hora, minuto esculo, ano, ms, dia, hora, minuto esegundosegundo
Datas vlidas para uma varivel data estoDatas vlidas para uma varivel data estoentre 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 operaes aritmticas sobreum valor do tipo DATE.
-
5/28/2018 Apostila Prog PL SQL
37/295
Converso entre Tipos
Sempre que o PL/SQL efetua uma operaoenvolvendo um ou mais valores, ele primeiro
converte os dados para o formato corretopara a operao.Converso Explcita
usada uma funo de converso pr usada uma funo de converso pr--definidadefinida
Converso Implcitasempre que necessrio, o PL/SQL tenta convertersempre que necessrio, o PL/SQL tenta converteros valores para efetuar a operaoos valores para efetuar a operao
-
5/28/2018 Apostila Prog PL SQL
38/295
Valores Nulos em PL/SQL
NULL nunca igual a qualquer outra coisaIF nome = NULL THEN ...IF nome = NULL THEN ... ---- ERRADOERRADO
Quando usados uma funo utilizando umvalor nulo, geralmente recebemos comoresultado um outro valor nulo.
nome := NULL;nome := NULL;
IF LENGTH(nome) = 0 THENIF LENGTH(nome) = 0 THEN ---- No funcionaNo funcionaManeira correta da comparao:
< identificador> IS NULL< identificador> IS NULL
< identificador> IS NOT NULL< identificador> IS NOT NULL
-
5/28/2018 Apostila Prog PL SQL
39/295
Valores Nulos em PL/SQL
Resultado de funes com argumento NULL:ConcatenaoConcatenao
Existem duas maneiras de efetuarmos umaconcatenao: funo CONCAT ou operador ||Nos dois casos, o valor NULL ignorado
Funo NVLFuno NVLnova_desc := NVL(antiga_desc, No aplicavel );
Funo REPLACEFuno REPLACEREPLACE( a.b.c.d.e.f. , . , NULL) = > abcdef
-
5/28/2018 Apostila Prog PL SQL
40/295
Declarao de Var iveis
Antes de fazer qualquer referncia a umavarivel, a mesma deve ser declarada.
Sintaxe [ atribuio de valor padro] [ atribuio de valor padro]
-
5/28/2018 Apostila Prog PL SQL
41/295
Declarao de Var iveis
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 DEFAULTVARCHAR2(50) NOT NULL DEFAULTPCS R USPCS R US
-
5/28/2018 Apostila Prog PL SQL
42/295
Cont role Condi c ionale Sequenc i al
-
5/28/2018 Apostila Prog PL SQL
43/295
Comandos IF.. .
Permitem que seja construda umalgica condicional nas aplicaes.
IF THEN
- TRUE
END IF;
Determina se os comandos entre o
THEN e o END IF sero executados,
de acordo com a condio.
IF THEN
- TRUE
ELSE
- FALSE
END IF;
Baseado na condio informada, ser
executado o cdigo entre o THEN e o
ELSE (TRUE) ou entre ELSE e o END
IF (FALSE).
IF ...
ELSIF
ELSE
END IF
seleciona uma ao dentre vrias
condies mutuamente exclusivas,
executando os comandos associados
condio.
-
5/28/2018 Apostila Prog PL SQL
44/295
Combinao 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_pedido
THENTHENimprime_imprime_relatoriorelatorio((relatoriorelatorio_id);_id);END IF;END IF;
-
5/28/2018 Apostila Prog PL SQL
45/295
Combinao IF-THEN-ELSE
ExemploIF :cliente.total_pedido >IF :cliente.total_pedido > maxmax_permitido_permit ido
THENTHENpedido_excedente := TRUE;pedido_excedente := TRUE;ELSEELSE
pedido_excedente := FALSE;pedido_excedente := FALSE;END IF;END IF;
-
5/28/2018 Apostila Prog PL SQL
46/295
Combinao IF-ELSIF
ExemploIFIF salariosalario < 10000< 10000THENTHEN
bonusbonus := 2000;:= 2000;ELSIFELSIF salariosalario < 20000< 20000THENTHEN
bonusbonus := 1500;:= 1500;ELSIFELSIF salariosalario < 40000< 40000
THENTHENbonusbonus := 1000;:= 1000;
ELSEELSEbonusbonus := 500;:= 500;
END IF;END IF;
-
5/28/2018 Apostila Prog PL SQL
47/295
Comando GOTO
Desvio incondicional para um rtulodefinido no programa.
GOTO nome_rotulo;GOTO nome_rotulo;............
Pelo menos um comando deve existiraps a definio de um rtulo.O rtulo deve ser nico no escopo.
-
5/28/2018 Apostila Prog PL SQL
48/295
Comando GOTO
Rtulo destino deve estar no mesmo escopoque o comando GOTO.
IF, BEGIN,IF, BEGIN, LoopLoop, mdulo., mdulo.
Rtulo destino deve estar na mesma partedo bloco PL/SQL que o comando GOTO.
ex.: um GOTO na seo executvel no podeex.: um GOTO na seo executvel no pode
desviar para a seo dedesviar para a seo de exceptionsexceptions..O cdigo resultante com o uso do GOTOpode tornar-se complexo e desestruturado,dificultando a manuteno.
-
5/28/2018 Apostila Prog PL SQL
49/295
Comando NULL
Melhorar a clareza do programa
IF :IF : reportreport ..selectionselection = DETAIL= DETAIL
THENTHENexecexec__detaildetail__reportreport ;;ELSEELSE
NULL;NULL;
END IF;END IF;Tirar o efeito de uma exceptionProjeto top-down dos mdulos do sistema.Utilizao conjunta com o GOTO.
-
5/28/2018 Apostila Prog PL SQL
50/295
SQL*Plus
-
5/28/2018 Apostila Prog PL SQL
51/295
SQL*Plus
Permite introduzir interativamenteinstrues de SQL e blocos PL/SQL a
partir de uma linha de comandos que soenviadas diretamente para a base dedados
Comandos no so sensveis a maisculase minsculas
-
5/28/2018 Apostila Prog PL SQL
52/295
Var iveis de Subst i t u i o
Identificadas pelo caracter &Substituio textual da varivel antes de
enviar a instruo para o servidorExemplo:
selectselect ** from empfrom emp
where empnowhere empno=&num_empregado;=&num_empregado;
-
5/28/2018 Apostila Prog PL SQL
53/295
Var iveis de Associao
Variveis de memria, podendo serutilizadas em um ou mais blocos PL/SQL
Tipos vlidos:VARCHAR2VARCHAR2
CHARCHAR
NUMBERNUMBERNo podem ser restringidas por preciso ouescala
REFCURSOR (a partir do SQL*REFCURSOR (a partir do SQL* PlusPlus 3.2)3.2)
-
5/28/2018 Apostila Prog PL SQL
54/295
Var iveis de Associao
Exemplo:SQL> VARIABLE v_contador NUMBERSQL> VARIABLE v_contador NUMBER
SQL> BEGINSQL> BEGIN22 SELECT COUNT(*)SELECT COUNT(*)33 INTO :v_contadorINTO :v_contador44 FROMFROM empemp
55 WHEREWHERE empnoempno > 1000;> 1000;6 END;6 END;
7 /7 /SQL> PRINT v_contadorSQL> PRINT v_contador
Aps a execuo, a varivel v_contadorAps a execuo, a varivel v_contadorconter o resultado doconter o resultado do selectselect feito no bloco.feito no bloco.
-
5/28/2018 Apostila Prog PL SQL
55/295
EXECUTE
Uma chamada a stored procedures deveser feita atravs do comando EXECUTE
Exemplo:EXECUTE minha_EXECUTE minha_procedureprocedure(param1,...);(param1,...);O SQL*O SQL* PlusPlus enviar o seguinte bloco PL/SQLenviar o seguinte bloco PL/SQLpara a base de dados:para a base de dados:BEGIN minha_BEGIN minha_procedureprocedure(param1,...); END;(param1,...); END;
-
5/28/2018 Apostila Prog PL SQL
56/295
Executar Arquivos de Inst rues
Para executar quaisquer instrues SQLou blocos PL/SQL
Pode-se utilizar start ou @Exemplos:
startstart cria_cria_procproc.sql.sql
startstart cria_cria_funcfuncstartstart pacote1.pacote1.pckpck@@funcaofuncao_teste._teste.fncfnc
A extenso default sql
-
5/28/2018 Apostila Prog PL SQL
57/295
SHOW ERRORS
Mostra erros de compilao armazenadosna view user_errors
Utilizado aps uma tentativa de criarstored procedures e receber a mensagem:WarningWarning:: Procedure created with compilation errorsProcedure created with compilation errors
-
5/28/2018 Apostila Prog PL SQL
58/295
Exercc io I .1
Faa um script que, dado um nmero inteiro,retorne o sua raiz quadrada (p/ rodar no
SQL* Plus).Sugestes:utilize a funo SQRTutilize a funo SQRT
utilize o modo de entrada de dados do SQL*utilize o modo de entrada de dados do SQL* PlusPlus(&(&variavelvariavel))construa um bloco annimoconstrua um bloco annimo
utilize o comando DBMS_OUTPUT.PUT_LINEutilize o comando DBMS_OUTPUT.PUT_LINE
-
5/28/2018 Apostila Prog PL SQL
59/295
Exercc io I .2
Faa um script que calcule as razes de umaequao de 2o grau
Sugestes:utilize o mdulo de entrada de dados do SQL*utilize o mdulo de entrada de dados do SQL* PlusPlus(&(&variavelvariavel))
construa um bloco annimoconstrua um bloco annimo
Obs.: eq = ax2 + bx + c = 0raiz1 = (raiz1 = ( --b +b + sqrtsqrt (b(b22 -- 4.a.c) ) / 2.a4.a.c) ) / 2.a
raiz2 = (raiz2 = ( --bb -- sqrtsqrt (b(b22 -- 4.a.c) ) / 2.a4.a.c) ) / 2.a
-
5/28/2018 Apostila Prog PL SQL
60/295
Loops
-
5/28/2018 Apostila Prog PL SQL
61/295
Conce i tos
Um loop permite que um mesmo cdigoseja executado repetidamente.
LoopLoop SimplesSimplesLoopLoop FOR (p/ nmeros e cursores)FOR (p/ nmeros e cursores)
LoopLoop WHILEWHILE
Na maioria dos casos, uma lgica querequer um loop pode usar qualquer dastrs construes existentes.
-
5/28/2018 Apostila Prog PL SQL
62/295
Loop Sim p les
LOOP
END LOOP;
O teste para terminao feito dentro doloop
EXITEXITEXIT WHEN < condio>EXIT WHEN < condio>
-
5/28/2018 Apostila Prog PL SQL
63/295
Loop Sim p les
ExemplosLOOP
balanco_restante := balanco_conta(conta_id);
IF balanco_restante < 1000 THENEXIT;
ELSE
aplicar_balanco(conta_id, balanco_restante);
END IF;
END LOOP;LOOP
balanco_restante := balanco_conta(conta_id);
EXIT WHEN balanco_restante < 1000;
aplicar_balanco(conta_id, balanco_restante);
END LOOP;
-
5/28/2018 Apostila Prog PL SQL
64/295
Loop Sim p les
Quando usarno existe a certeza de quantas vezes ono existe a certeza de quantas vezes o looploop serserexecutadoexecutado
oo looploop deve executar pelo menos uma vezdeve executar pelo menos uma vez
-
5/28/2018 Apostila Prog PL SQL
65/295
Loop FOR
FOR numricoFOR IN [REVERSE] < menor> ..> IN [REVERSE] ..< maior>LOOPLOOP
END LOOP;END LOOP;
OO looploop termina quando o cdigo executado otermina quando o cdigo executado onmero de vezes correspondente ao intervalonmero de vezes correspondente ao intervalo
informadoinformadoAps cada execuo do bloco, o PL/SQL verificaAps cada execuo do bloco, o PL/SQL verificase o valor atual do ndice excede a diferenase o valor atual do ndice excede a diferenaentre o maior e menor nmero informado na faixaentre o maior e menor nmero informado na faixa
-
5/28/2018 Apostila Prog PL SQL
66/295
Loop FOR
FOR numricoQuando usar:Quando usar:
cdigo dentro do loop ser executado um nmero fixode vezes, sem ser necessria uma interrupo
RegrasRegrasno declare o ndice usado no loopno mude o valor das variveis usadas para informar
a faixa de valores (a faixa analisada no incio doloop), muito menos o valor do ndiceno use o comando EXIT dentro do loop FOR
-
5/28/2018 Apostila Prog PL SQL
67/295
Loop FOR
FOR numricoExemplosExemplos
FOR contador IN 1..10LOOP
...
END LOOP;
FOR contador IN REVERSE 1..10
LOOP...
END LOOP;
FOR ind_calc IN ini_periodo ..
LEAST(fim_periodo,periodo_atual)
LOOP
...
END LOOP;
-
5/28/2018 Apostila Prog PL SQL
68/295
Loop WHILE
WHILE LOOP
END LOOP;Executa at que a condio seja falsa.Antes de cada execuo do bloco dentro loop,
o PL/SQL avalia a condio informada.
-
5/28/2018 Apostila Prog PL SQL
69/295
Loop WHILE
Quando usarno temos certeza de quantas vezes devemosno temos certeza de quantas vezes devemosexecutar o corpo doexecutar o corpo do looploop
desejamos interromper odesejamos interromper o looploop de acordo comde acordo comuma condiouma condio
no necessariamente temos que executar ono necessariamente temos que executar o looploop
pelo menos uma vezpelo menos uma vez
-
5/28/2018 Apostila Prog PL SQL
70/295
Loop WHILE
WHILE total
-
5/28/2018 Apostila Prog PL SQL
71/295
Registros em PL/SQL
-
5/28/2018 Apostila Prog PL SQL
72/295
Conce i tos
Um registro em PL/SQL bastantesimilar estrutura de linhas em umatabela.Um registro uma estrutura de dadoscomposta.O registro como um todo no tem um
valor. Cada componente ou campo que o possui.
-
5/28/2018 Apostila Prog PL SQL
73/295
Tipos de Registro
Baseado em Tabelacada campo corresponde a uma coluna emcada campo corresponde a uma coluna emuma tabela, inclusive com o mesmo nomeuma tabela, inclusive com o mesmo nome
Baseado em Cursorcada campo corresponde a uma coluna oucada campo corresponde a uma coluna ouexpresso no comando SELECT de umexpresso no comando SELECT de um
cursorcursorDefinido pelo Programador
cada campo definido explicitamentecada campo definido explicitamente(nome e tipo) atravs do comando TYPE(nome e tipo) atravs do comando TYPE
-
5/28/2018 Apostila Prog PL SQL
74/295
Declarao de um Registro
Baseado em Tabelas%ROWTYPE;> < nome_tabela>%ROWTYPE;
DECLAREDECLAREempresa_empresa_regreg empresa%ROWTYPE;empresa%ROWTYPE;
Baseado em Cursores %ROWTYPE;> < nome_cursor> %ROWTYPE;
DECLAREDECLAREempresa_empresa_regreg empresa_empresa_curcur%ROWTYPE;%ROWTYPE;
-
5/28/2018 Apostila Prog PL SQL
75/295
Declarao de um Registro
Definido pelo ProgramadorTYPE < nome_tipo> IS RECORDTYPE < nome_tipo> IS RECORD
( ,( , , ,...... )
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) );
-
5/28/2018 Apostila Prog PL SQL
76/295
Tabelas PL/SQL
-
5/28/2018 Apostila Prog PL SQL
77/295
Def in io
Como um array, uma tabela PL/SQL umacoleo ordenada de elementos de um mesmo
tipo.Uma tabela PL/SQL no tem limites detamanho, pode ser incrementadadinamicamente.
O ndice de acesso da tabela no precisa serum nmero sequencial. Por exemplo, pode-seusar uma srie como nmero do empregado(como 7369, 7499, 7521, 7566, )
-
5/28/2018 Apostila Prog PL SQL
78/295
Definindo uma Tabela PL/SQL
TYPE table_type_name IS TABLE OFdatatype [NOT NULL]
[INDEX BY BINARY_INTEGER];ondeonde tabletable__typetype__namename um tipo especificado um tipo especificadopelo usurio.pelo usurio.
Na verso 8 a clusula INDEX BY opcional.
-
5/28/2018 Apostila Prog PL SQL
79/295
Exemplos
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;
-
5/28/2018 Apostila Prog PL SQL
80/295
Referenciando 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;
-
5/28/2018 Apostila Prog PL SQL
81/295
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;
-
5/28/2018 Apostila Prog PL SQL
82/295
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;BEGIN
OPEN 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;
-
5/28/2018 Apostila Prog PL SQL
83/295
Atr ibutos de Tabela: COUNT
Retorna o nmero de elementos natabela.
...IF ename_tab.COUNT = 50 THEN
...
END;
-
5/28/2018 Apostila Prog PL SQL
84/295
Atr ibutos de Tabela: DELETE
Este atributo tem 3 formas:tabela.DELETE remove todos os elementos databela.DELETE remove todos os elementos da
tabela;tabela;tabela.DELETE(n) remove o elemento n databela.DELETE(n) remove o elemento n databela;tabela;
tabela.DELETE(m,n) remove o range m .. n.tabela.DELETE(m,n) remove o range m .. n.
uma instruo completa por si s; no chamada como parte de uma expresso
-
5/28/2018 Apostila Prog PL SQL
85/295
Atr ibutos de Tabela: EXISTS
Retorna TRUE se existir uma linha comndice i na tabela, caso contrrio retorna
FALSE.IF sal_tab.EXISTS(i) THEN
sal_tab(i) := sal_tab(i) + 500;
ELSERAISE salary_missing;
END IF;...
-
5/28/2018 Apostila Prog PL SQL
86/295
Atributos de Tabela: FIRST e LAST
Retornam o ndice da primeira e da ltimalinha da tabela, respectivamente.
...FOR i IN emp_tab.FIRST .. emp_tab.LAST LOOP...
END LOOP;
A primeira linha a que tem o ndice maisbaixo e a ltima, o mais elevado.
-
5/28/2018 Apostila Prog PL SQL
87/295
Atributos de Tabela: NEXT e PRIOR
Retornam o ndice do elemento seguinteou 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;
-
5/28/2018 Apostila Prog PL SQL
88/295
SQL em PL/SQL
-
5/28/2018 Apostila Prog PL SQL
89/295
Instrues de SQL
Podem dividir-se em seis categorias:DML: linguagem de manipulao de dadosDML: linguagem de manipulao de dados
DDL: linguagem de definio de dadosDDL: linguagem de definio de dadosControle de transaesControle de transaes
Controle de sessesControle de sesses
Controle do sistemaControle do sistema
SQL incorporado (para prSQL incorporado (para pr--compiladores)compiladores)
-
5/28/2018 Apostila Prog PL SQL
90/295
SQL em PL/SQL
Num programa PL/SQL s podem serusadas as seguintes instrues:
DML:DML: selectselect ,, insertinsert ,, updateupdate,, deletedeleteControle de transaes:Controle de transaes: commitcommit,, rollbackrollback,,savepointsavepoint
Existe uma alternativa para o uso deinstrues DDL em PL/SQL
AA packagepackage DBMS_SQL, disponvel a partir daDBMS_SQL, disponvel a partir daverso 2.1 permite a criao de SQL dinmicoverso 2.1 permite a criao de SQL dinmico
-
5/28/2018 Apostila Prog PL SQL
91/295
DML: Select
Busca informaes do banco de dadospara variveis PL/SQL
SELECT emp.enameINTO v_enameFROM empWHERE emp.empno = 7902;
Deve retornar somente uma linhaA clusula INTO s usada em blocosPL/SQL
-
5/28/2018 Apostila Prog PL SQL
92/295
DML: Insert
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;
-
5/28/2018 Apostila Prog PL SQL
93/295
DML: Update
Altera o contedo de uma ou mais linhasde uma tabela
UPDATE empSET sal = sal * 1.2WHERE empno = 1;
-
5/28/2018 Apostila Prog PL SQL
94/295
DML: Delete
Elimina uma ou mais linhas de uma tabelaDELETE FROM emp
WHERE empno = 1;
-
5/28/2018 Apostila Prog PL SQL
95/295
Clusula WHERE
Nas instrues SELECT, UPDATE eDELETE esta clusula serve para restringir
o conjunto de linhas sobre as quais aoperao ser executada.Constituda por condies, normalmentede comparao, separadas pelosoperadores AND, OR, NOT
-
5/28/2018 Apostila Prog PL SQL
96/295
Referncias de tabelas
As operaes de DML referenciam umatabela, de uma forma geral, no formato:
[[ ownerowner.]tabela[@.]tabela[@dblinkdblink]]onde:
owner - usurio onde a tabela foi criadadblink - denominao de uma conexo a um
banco de dados remoto
-
5/28/2018 Apostila Prog PL SQL
97/295
Sinnimos
Utilizados para facilitar o acesso aosobjetos do banco de dados, evitando o
uso de owner e dblink para identific-los.Exemplo:Exemplo:CREATE PUBLIC SYNONYM empregado FORCREATE PUBLIC SYNONYM empregado FOR
owner1.owner1.empemp@bd1;@bd1;
Aps isto podeAps 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;
-
5/28/2018 Apostila Prog PL SQL
98/295
Pseudo-colunas
Funes adicionais que s podem serchamadas a partir de instrues SQL:
CURRVAL e NEXTVALCURRVAL e NEXTVALLEVELLEVEL
ROWIDROWID
ROWNUMROWNUM
-
5/28/2018 Apostila Prog PL SQL
99/295
Pseudo-colunas: CURRVAL e NEXTVAL
Utilizadas com sequncias (objetos Oraclepara gerar nmeros nicos)
sequncia.CURRVALretorna o valor atual daretorna o valor atual da sequnciasequncia
sequncia.NEXTVAL
retorna o prximo valor daretorna o prximo valor da sequnciasequnciaExemplo:SELECTSELECT mymy__seqseq.NEXTVAL.NEXTVAL fromfrom dual;dual;
-
5/28/2018 Apostila Prog PL SQL
100/295
Pseudo-colunas: LEVEL
Utilizado dentro de uma instruo SELECTque implementa uma pesquisa de rvore
hierrquica numa tabela utilizando asclusulas START WITH e CONNECT BY.Esta pseudo-coluna retorna o nvel atualda rvore.
-
5/28/2018 Apostila Prog PL SQL
101/295
Pseudo-c olunas : ROWID
Retorna o endereo fsico de uma linha databela, num valor do tipo ROWID
Um SELECT utilizando-se de ROWID na clusulaWHERE o mtodo mais otimizado de serecuperar uma linhaExemplo:v_rowid ROWID;...SELECT ROWID INTO v_rowid FROM emp;...
UPDATE emp set ... WHERE emp.rowid = v_rowid;
-
5/28/2018 Apostila Prog PL SQL
102/295
Pseudo-c olunas : ROWNUM
Retorna o nmero atual da linha numSELECT
Utilizado principalmente na clusulaWHERE para limitar as linhas a seremconsideradasSELECT * FROM emp WHERE ROWNUM < 3;
O valor ROWNUM atribudo a uma linhaantes de ser efetuada uma ordenao(ORDER BY)
-
5/28/2018 Apostila Prog PL SQL
103/295
Priv i lgios de Acesso
Privilgios de ObjetoPara efetuar operaes num objeto
Privilgios de SistemaPara efetuar operaes numa classe deobjetos
-
5/28/2018 Apostila Prog PL SQL
104/295
GRANT
Para dar privilgios de acessoObjeto:Objeto:
GRANT privilgio ON objeto TO usurio[WITH GRANT OPTION]
Sistema:Sistema:GRANT privilgio TO usurio
[WITH ADMIN OPTION]
-
5/28/2018 Apostila Prog PL SQL
105/295
REVOKE
Para revogar privilgios de acessoObjeto:Objeto:
REVOKE privilgio ON objeto FROM usurio
[CASCADE CONSTRAINTS]
Sistema:Sistema:REVOKE privilgio FROM usurio
-
5/28/2018 Apostila Prog PL SQL
106/295
Perfis de Grupo
Os privilgios comuns podem ser agrupados emROLES, para facilitar a concesso para vriosusurios que possuem o mesmo perfilEm vez de dar privilgios para cada usurio:
CriaCria--se uma role: CREATE ROLE rolese uma role: CREATE ROLE roleConcedemConcedem--se os privilgios: GRANT ... TOse os privilgios: GRANT ... TO
roleroleAtribuemAtribuem--se os usurios para essa rolese os usurios para essa roleGRANT role TO usurioGRANT role TO usurio
PUBLIC: perfil genrico para todos os usurios
-
5/28/2018 Apostila Prog PL SQL
107/295
Controle de Transaes
COMMITSalva as operaes da transao e libera
locks. As operaes so visveis a outrassessesROLLBACKDesfaz as operaes e libera locksSAVEPOINTPonteiro para marcar o nicio para ondeum ROLLBACK pode ser efetuado
-
5/28/2018 Apostila Prog PL SQL
108/295
Funes de SQL integradas
-
5/28/2018 Apostila Prog PL SQL
109/295
Funes para Caracteres
Nome Descrio
ASCII retorna o cdigo ASCII de um caractere
CHR retorna o caractere associado ao cdigo ASCII
CONCAT concatena duas strings
INITCAP transforma a primeira letra de cada palavra emmaiscula
INSTR retorna a localizao em uma string da
substring especificada
LENGTH retorna o tamanho da string
LOWER converte todas as letras para minsculas
LPAD adiciona uma string esquerda
-
5/28/2018 Apostila Prog PL SQL
110/295
Funes para Caracteres
Nome Descrio
LTRIM retira do lado esquerdo da string todos os caracteres recebidoscomo parmetro
REPLACE substitui uma sequncia 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 parmetro
SOUNDEX retorna a representao fontica de uma string
SUBSTR retorna a poro especificada da string
TRANSLATE traduz caracteres nicos em uma string por um caracterdiferente
UPPER converte todas as letras para maisculas
-
5/28/2018 Apostila Prog PL SQL
111/295
Funes para Caracteres
ExemplosFUNCTION INSTR(string1 IN VARCHAR2,FUNCTION INSTR(string1 IN VARCHAR2,
string2 IN VARCHAR2string2 IN VARCHAR2[,[ , pospos__iniini IN NUMBER := 1IN 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 NUMBERIN NUMBER[, string_[, string_padpad IN VARCHAR2])IN VARCHAR2])RETURN VARCHAR2RETURN VARCHAR2
LPAD( 55 , 10, 0) = > 0000000055LPAD( 12345678 , 5, 0 ) => 12345
-
5/28/2018 Apostila Prog PL SQL
112/295
Funes para Caracteres
ExemplosFUNCTION LTRIM(string1 IN VARCHAR2FUNCTION LTRIM(string1 IN VARCHAR2
[,[ , trimtrim_string IN VARCHAR2])_string IN VARCHAR2])
RETURN VARCHAR2RETURN VARCHAR2LTRIM( Eu gosto de pizza ) = > Eu gosto de pizza
FUNCTION SUBSTR(string_in IN VARCHAR2,FUNCTION SUBSTR(string_in IN VARCHAR2,pospos__iniini IN NUMBERIN NUMBER
[, tam_[, tam_substrsubstr_in IN_in INNUMBER])NUMBER])RETURN VARCHAR2RETURN VARCHAR2
SUBSTR( Eu gosto de pizza , 4, 5) => gostoSUBSTR( Eu gosto de pizza , -1) = > a
-
5/28/2018 Apostila Prog PL SQL
113/295
Funes para Datas
Nome Descrio
ADD_MONTHS adiciona o nmero de meses especificado data
LAST_DAY retorna o ltimo dia do ms da data especificada
MONTHS_BETWEEN retorna o nmero 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 formato
especificadoSYSDATE retorna a hora/data corrente no Oracle Server
TRUNC trunca a data da sua poro hora, de acordo como formato especificado
-
5/28/2018 Apostila Prog PL SQL
114/295
Funes para Datas
ExemplosLAST_DAY(data_in IN DATE) RETURN DATELAST_DAY(data_in IN DATE) RETURN DATE
LAST_DAY(SYSDATE) - SYSDATE = > nmero dedias at o final do ms.
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
-
5/28/2018 Apostila Prog PL SQL
115/295
Fun es Num r ic as
Nome Descrio
ABS valor absoluto do nmero
COS / ACOS / COSH cosseno; cosseno inverso; cosseno hiperblico
SIN / ASIN / SINH seno; seno inverso; seno hiperblicoTAN / ATAN TANH tangente; tangente inversa; tangente hiperblica
CEIL retorna o teto inteiro de um nmero
EXP(n) eelevado n-sima potncia
FLOOR maior inteiro menor ou igual ao nmero
LN(a) logaritmo natural de a.
LOG(a, b) logaritmo na base a de b.
MOD(a, b) resto da diviso de a por b.
-
5/28/2018 Apostila Prog PL SQL
116/295
Fun es Num r ic as
Nome Descrio
POWER(a,b) a elevado b-sima potncia
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 nmero
TRUNC(a, [b]) a truncado at b casas decimais
-
5/28/2018 Apostila Prog PL SQL
117/295
Outras Funes
Nome Descrio
DECODE retorna o resultado de uma comparao no estilo if-then-else
DUMP retorna uma string contendo um dump da expresso especificada
GREATEST retorna o maior dos valores especificados
LEAST retorna o menor dos valores especificados
NVL substitui o valor NULL por um outro valor
SQLCODE retorna o nmero do erro do Oracle para a exceptionmais recente
SQLERRM retorna a mensagem de erro do Oracle para a exceptionmaisrecente
UID retorna o User ID da sesso corrente no Oracle
USER retorna o nome do usurio logadoUSERENV retorna uma string contento infos sobre a sesso corrente no Oracle
VSIZE retorna o nmero de bytes da representao interna do valorespecificado
-
5/28/2018 Apostila Prog PL SQL
118/295
Outras Funes
ExemplosFUNCTION SQLCODE RETURN INTEGERFUNCTION SQLCODE RETURN INTEGER
FUNCTION SQLERRM RETURN VARCHAR2FUNCTION SQLERRM RETURN VARCHAR2EXCEPTIONWHEN OTHERS THEN
MESSAGE( Error | | TO_CHAR(SQLCODE)| | : | | SQLERRM);
-
5/28/2018 Apostila Prog PL SQL
119/295
Funes de Converso
Nome Descrio
CHARTOROWID converte uma string para ROWID
CONVERT converte uma string de uma character set
para outroHEXTORAW converte de hexadecimal para o formato
RAW
RAWTOHEX converte de raw para hexadecimal
ROWIDTOCHAR converte de ROWID para uma string
TO_CHAR converte um nmero ou data para string
TO_DATE converte uma string para data
TO_NUMBER converte uma string para nmero
-
5/28/2018 Apostila Prog PL SQL
120/295
Funo 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,1997TO_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
-
5/28/2018 Apostila Prog PL SQL
121/295
Funo 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
-
5/28/2018 Apostila Prog PL SQL
122/295
Funo 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
-
5/28/2018 Apostila Prog PL SQL
123/295
Funes de Grupo
Somente para SELECT com GROUP BYNome Descrio
AVG retorna a mdia dos valores da colunaCOUNT retorna o nmero de linhas que a coluna no nula
MAX retorna o valor mximo da coluna
MIN retorna o valor mnimo da coluna
STDDEV retorna o desvio padro da coluna
SUM retorna a soma dos valores da coluna
VARIANCE retorna a varincia estatstica da coluna
-
5/28/2018 Apostila Prog PL SQL
124/295
Cursores
-
5/28/2018 Apostila Prog PL SQL
125/295
Conce i tos
Um cursor pode ser encarado como umponteiro para a tabela virtual no banco de
dados representada pelo comandoSELECT 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;;
-
5/28/2018 Apostila Prog PL SQL
126/295
Operaes em Cursores
OPENabre o cursor, faz oabre o cursor, faz o parseparse e oe o bindbind dadaconsulta associada, identificando o resultadoconsulta associada, identificando o resultado
o cursor posicionado antes da primeira linha.o cursor posicionado antes da primeira linha.FETCH
busca a linha corrente do cursor e o posiciona nabusca a linha corrente do cursor e o posiciona na
prximaprximaCLOSE
fecha o cursor e libera a memria alocada.fecha o cursor e libera a memria alocada.
-
5/28/2018 Apostila Prog PL SQL
127/295
Tipos de Cursores
Cursores Estticossempre referenciam um comando SQL, que sempre referenciam um comando SQL, que
conhecido em tempo de compilao.conhecido em tempo de compilao.Variveis Cursoresa varivel referencia um objeto cursor e podea varivel referencia um objeto cursor e podereferenciar diferentes comandos SQL emreferenciar diferentes comandos SQL em
ocasies diferentes.ocasies diferentes.novanova featurefeature do PL/SQL.do PL/SQL.
-
5/28/2018 Apostila Prog PL SQL
128/295
Tipos de Cursores
Implcitoso PL/SQL utiliza um cursor implcito sempre queo PL/SQL utiliza um cursor implcito sempre queum comandos SQL executado diretamente noum comandos SQL executado diretamente no
cdigo, desde que o cdigo no utilize um cursorcdigo, desde que o cdigo no utilize um cursorexplcitoexplcito
usados em cada UPDATE, INSERT ou DELETEusados em cada UPDATE, INSERT ou DELETE
so menos eficientes que cursores explcitosso menos eficientes que cursores explcitos
mais suscetveis a erromais suscetveis a erro
-
5/28/2018 Apostila Prog PL SQL
129/295
Tipos de Cursores
Explcitoscomando SELECT explicitamente definido nacomando SELECT explicitamente definido na
seo de declarao, sendo um nomeseo de declarao, sendo um nomeassociado a eleassociado a ele
usados quando desejamos recuperar mais deusados quando desejamos recuperar mais deuma linha de resultadouma linha de resultado
no existem para comandos de UPDATE,no existem para comandos de UPDATE,INSERT e DELETEINSERT e DELETE
-
5/28/2018 Apostila Prog PL SQL
130/295
Dec larao
CURSOR nome_cursor [ ( [ parmetro [,parmetro ...] ) ]
[ RETURN especificao_retorno ]IS comando_SELECT;
V i i C
-
5/28/2018 Apostila Prog PL SQL
131/295
Variveis em um Cursor
Nome do Cursor no uma varivelNo PL/SQL, a lista de itens no SELECT podeconter colunas, variveis do PL/SQL e
variveis associadas (p.e. Oracle Forms).DECLAREDECLARE
bonusbonus 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);
-
5/28/2018 Apostila Prog PL SQL
132/295
Precedncia de um Ident i f icador
Em um cursor, existe precedncia do nomeda coluna sobre o nome de uma varivelPL/SQL.
PROCEDURE melhorar_SQLPROCEDURE melhorar_SQLISIS
salariosalario NUMBER := 1000;NUMBER := 1000;CURSOR dobrar_sal_CURSOR dobrar_sal_curcur ISIS
SELECTSELECT salariosalario ++ salariosalarioFROM empregadoFROM empregadoWHEREWHERE dtdt__contratcontrat < ADD_MONTHS(SYSDATE,< ADD_MONTHS(SYSDATE,--36);36);
BEGINBEGIN
A l l RETURN
-
5/28/2018 Apostila Prog PL SQL
133/295
A c lasu la RETURN
Somente pode ser usada para cursoresque esto contidos em um package.
A clasula RETURN pode ser feita com asseguintes 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 prpr--definido pelodefinido pelo progamadorprogamador
E l d U d l l RETURN
-
5/28/2018 Apostila Prog PL SQL
134/295
Ex em plo de Uso da c lasu la RETURN
Primeiro a definio 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 definio 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;
P l P k ?
-
5/28/2018 Apostila Prog PL SQL
135/295
Porque colocar cursor numa Package?
Uma package uma coleo de objetoslogicamente relacionados
Agrupando os cdigos, torna-se mais fcila identificao e uso dos cdigos peloprogramadorCursores em packages so essencialmentecaixas pretasO programador no precisa saber comoum cursor recuperado
Ab i d C
-
5/28/2018 Apostila Prog PL SQL
136/295
Abrindo Cursores
OPEN [ (parmetro [,parmetro ...] ) ];
O comando OPEN no recupera linhas.Todos os fetches refletiro os dadosexatamente como da ocasio em que ocursor foi aberto.
R d D d d C
-
5/28/2018 Apostila Prog PL SQL
137/295
Recuperando Dados de Cursores
FETCH < nome_cursor> INTO
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 hand o Curso res
-
5/28/2018 Apostila Prog PL SQL
138/295
Fec hand o Curso res
CLOSE < nome_cursor>Libera rea de memria (SGA).
Libera todo bloqueio (lock) causado pelocursor.Existe um limite mximo de cursores quepodem ser abertos no SGBD Oracle.
Um cursor automaticamente fechadoquando o seu escopo abandonado.
Atr ibutos de Cursores
-
5/28/2018 Apostila Prog PL SQL
139/295
Atr ibutos de Cursores
Nome Descrio
%FOUND retorna TRUE se o registro foi
recuperado com sucesso
%NOTFOUND recupera TRUE se o registro no foirecuperado com sucesso
%ROWCOUNT retorna o nmero de registros
recuperados at o momento
%ISOPEN retorna TRUE se o cursor estiveraberto
Atr ibutos de Cursores
-
5/28/2018 Apostila Prog PL SQL
140/295
Atr ibutos 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;......
Atr ibutos de Cursores
-
5/28/2018 Apostila Prog PL SQL
141/295
Atr ibutos de Cursores
%NOTFOUNDOposto ao %FOUNDOposto ao %FOUND
Muito utilizado para terminao deMuito utilizado para terminao de loopsloopsEXIT WHEN empresa_cur%NOTFOUND;
Atr ibutos de Cursores
-
5/28/2018 Apostila Prog PL SQL
142/295
Atr ibutos de Cursores
%ROWCOUNTDECLAREDECLARE
CURSORCURSOR empemp__curcur ISISSELECT nome,SELECT nome, salariosalarioFROM empregadoFROM empregado
ORDER BYORDER BY salariosalario DESC;DESC;empemp__reg empreg emp__curcur%ROWTYPE;%ROWTYPE;
BEGINBEGINOPENOPEN empemp__curcur;;LOOPLOOP
FETCHFETCH empemp__curcur INTOINTO empemp__regreg;;
EXIT WHENEXIT WHEN empemp__curcur%ROWCOUNT > 10 OR%ROWCOUNT > 10 ORempemp__curcur%NOTFOUND;%NOTFOUND;DBMS_OUTPUT.PUT_LINE(DBMS_OUTPUT.PUT_LI NE(empemp__regreg.nome ||.nome || -- | || |
empemp__regreg..salariosalario););END LOOP;END LOOP;
END;END;
Atr ibutos de Cursores
-
5/28/2018 Apostila Prog PL SQL
143/295
Atr ibutos de Cursores
%ISOPENIF NOTIF NOT empemp__curcur%ISOPEN THEN%ISOPEN THEN
OPENOPEN empemp__curcur;;
END IF;END IF;
Atr ibutos de Cursores Impl c i tos
-
5/28/2018 Apostila Prog PL SQL
144/295
Atr ibutos de Cursores Impl c i tos
Quando o RDBMS abre um cursor ouexecuta um insert, update ou delete, ele
torna uma das seguintes variveishabilitadas:SQL%FOUNDSQL%FOUND
SQL%NOTFOUNDSQL%NOTFOUND
SQL%ROWCOUNTSQL%ROWCOUNTSQL%ISOPENSQL%ISOPEN
-
5/28/2018 Apostila Prog PL SQL
145/295
Parmetros em Cursores
Um parmetro faz com que um cursor se tornemais reutilizvel.
DECLAREDECLARE
CURSOR empresa_CURSOR empresa_curcur (categoria_in VARCHAR2)(categoria_in VARCHAR2)ISIS
SELECT nome, categoria, contatoSELECT nome, categoria, contatoFROM empresaFROM empresaWHERE categoria = UPPER(categoria_in);WHERE categoria = UPPER(categoria_in);
Podemos definir um valor padro para umparmetro.
CURSORCURSOR empemp__curcur((empemp_in NUMBER := 0)_in NUMBER := 0)
-
5/28/2018 Apostila Prog PL SQL
146/295
SELECT ... FOR UPDATE
Quando um comando SELECT ... FORUPDATE executado, o Oracleautomaticamente bloqueia a linha de
maneira exclusivaNingum conseguir alterar estes registrosNingum conseguir alterar estes registrosantes de um ROLLBACK ou COMMITantes de um ROLLBACK ou COMMIT
CURSORCURSOR empemp__curcur ISIS
SELECT nome,SELECT nome, salariosalarioFROM empregadoFROM empregadoWHEREWHERE salariosalario < 100< 100FOR UPDATEFOR UPDATE
WHERE CURRENT OF
-
5/28/2018 Apostila Prog PL SQL
147/295
WHERE CURRENT OF
Esta clusula utilizada para comandosDELETE 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 iveis Cursor es
-
5/28/2018 Apostila Prog PL SQL
148/295
Var iveis Cursor es
Disponvel a partir das releases 2.2 e 2.3.Possibilidade de passar como parmetro o
resultado de consultas para outrosprogramas.Variveis cursores so como ponteiros doC ou Pascal, na qual um endereo dememria assinalado. Declarando umavarivel cursor se cria um ponteiro, noum objeto.
Porque usar var iveis cursor?
-
5/28/2018 Apostila Prog PL SQL
149/295
Porque usar var iveis cursor?
Usa-se uma varivel cursor para passar oresultado de uma query entre storedsubprograms e aplicaes client.Por exemplo, uma aplicao Client, OracleForms, e Oracle Server podem ambos sereferenciar mesma rea de trabalho.
Var iveis Cursor es
-
5/28/2018 Apostila Prog PL SQL
150/295
Var iveis Cursor es
OPEN cursorOPEN cursor
FETCH reg1FETCH reg1
CLOSE cursorCLOSE cursor
FETCH reg2FETCH reg2
FETCH reg3FETCH reg3
Var iveis Cursor es
-
5/28/2018 Apostila Prog PL SQL
151/295
Var iveis Cursor es
ExemploDECLAREDECLARE
TYPE empresa_TYPE empresa_curtipocurtipo IS REF CURSORIS REF CURSOR
RETURN empresa%ROWTYPE;RETURN empresa%ROWTYPE;empresa_curvar empresa_empresa_curvar empresa_curtipocurtipo;;
BEGINBEGINOPEN empresa_curvar FOR SELECT *OPEN empresa_curvar FOR SELECT *
FROM empresa;FROM empresa;
......
f C
-
5/28/2018 Apostila Prog PL SQL
152/295
Definindo uma Var ivel Cursor
TYPE ref_type_name IS REF CURSORRETURN return_type;
ondeonde refref__typetype__namename o nome da varivel o nome da varivelespecificada 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
TYPETYPE DeptCurTypDeptCurTyp IS REF CURSORIS REF CURSORRETURNRETURN deptdept%ROWTYPE;%ROWTYPE;
E S d P d
-
5/28/2018 Apostila Prog PL SQL
153/295
Em uma Stored Procedure
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 uma Stored Procedure( i )
-
5/28/2018 Apostila Prog PL SQL
154/295
(cont inuao. . . )
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 empWHERE comm IS NOTNULL;
ELSIF choice = 2 THENOPEN emp_cv FOR SELECT * FROM emp
WHERE sal > 2500;ELSIF choice = 3 THEN
OPEN emp_cv FOR SELECT * FROM empWHERE deptno = 20;END IF;
END open_emp_cv;END emp_data;
L Si l C
-
5/28/2018 Apostila Prog PL SQL
155/295
Loop Sim ples para Cursores
As instrues devem ser feitasexplicitamente:
Abrir o cursorAbrir o cursorColocar oColocar o fetchfetch dentro dodentro do looploop
Estabelecer a condio para fim doEstabelecer a condio para fim do looploop
Fechar o cursorFechar o cursor
Requer maior ateno do desenvolvedorMaior possibilidade de ocorrer erro
L Si l C
-
5/28/2018 Apostila Prog PL SQL
156/295
Loop Simples para Cursores
ExemploDECLARE
CURSOR cur_emp IS ...
BEGINOPEN cur_emp;LOOP
FETCH cur_emp INTO ...EXIT WHEN cur_emp%NOTFOUND;
-- processar informaes do cursorEND LOOP;CLOSE cur_emp;
END;
L FOR C
-
5/28/2018 Apostila Prog PL SQL
157/295
Loop FOR para Cursores
FOR indice_registro IN nome_cursorLOOP
END LOOP;
OO looploop termina incondicionalmente quandotermina incondicionalmente quandotodos os registros do cursor foremtodos os registros do cursor forem
recuperadosrecuperadosA cada execuo doA cada execuo do looploop, o PL/SQL verifica o, o PL/SQL verifica oatributo %NOTFOUNDatributo %NOTFOUND
L FOR C
-
5/28/2018 Apostila Prog PL SQL
158/295
Loop FOR para Cursores
ExemploDECLAREDECLARE
CURSORCURSOR ocupacaoocupacao__curcur ISIS
SELECTSELECT hosphosp_id,_id, nmnm_quarto_quartoFROMFROM ocupacaoocupacao WHEREWHERE dtdt__ocupacaoocupacao = SYSDATE;= SYSDATE;BEGINBEGIN
FORFOR 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;
L FOR C
-
5/28/2018 Apostila Prog PL SQL
159/295
Loop FOR para Cursores
Quando usar:quando desejamos recuperar e processarquando desejamos recuperar e processartodos os registros do cursortodos os registros do cursor
no apropriado situaes em queno apropriado situaes em quecondies devem ser avaliadas paracondies devem ser avaliadas paradeterminar o trmino da operao dedeterminar o trmino da operao derecuperaorecuperao
Observaoo ndice doo ndice do looploop, neste caso uma varivel do, neste caso uma varivel dotipo registro, encarado da mesma formatipo registro, encarado da mesma formaque ndices numricosque ndices numricos
E ercc io I I 1
-
5/28/2018 Apostila Prog PL SQL
160/295
Exercc io I I .1
Liste os 3 departamentos com maior folha(soma dos salrios dos empregados), emordem decrescente.Sugesto:
Utilize as tabelasUtilize as tabelas deptdept ee empemp (SCOTT/TIGER)(SCOTT/TIGER)
utilize o procedimentoutilize o procedimento
DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINE
Exercc io I I 2
-
5/28/2018 Apostila Prog PL SQL
161/295
Exercc io I I .2
De acordo com o salrio de umempregado, calcule o imposto de rendacorrespondente.Sugestes
Utilize a tabelaUtilize a tabela empemp SCOTT/TIGERSCOTT/TIGERNo considere possveis deduesNo considere possveis dedues
Obs.:salariosalario < 900< 900 -- isentoisentosalariosalario > 900 e 900 e 1800> 1800 -- 25%25% -- R$315R$315
Exercc io I I .3
-
5/28/2018 Apostila Prog PL SQL
162/295
Calcular o total de salrios pagos (salrio+ comisso) para empregados de umdepartamento. Determinar tambmquantos empregados tem salrio maiorque $2000 e quantos tem a comissomaior que o salrio.
-
5/28/2018 Apostila Prog PL SQL
163/295
Subprogramas:Procedimentos e Funes
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
164/295
Modularizaoprocesso de quebrar grandes blocos deprocesso de quebrar grandes blocos decdigo em pequenos pedaos (mdulos)cdigo em pequenos pedaos (mdulos)
torna o cdigo:torna o cdigo:mais reutilizvelmais fcil de gerenciarmais legvelmais confivel
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
165/295
Estruturas para Modularizao(PL/SQL):
procedimentoprocedimento
bloco que efetua uma ou mais aes, sendopossvel a passagem de informaes, tantopara dentro quanto para fora do procedimento
funofuno
retorna um nico valor; podemos passarinformaes para a funo atravs deparmetros
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
166/295
Conce i tos
bloco annimobloco annimobloco PL/SQL que efetua uma ou mais tarefas;
usado para controlar o escopo dosidentif icadores e manuseio de exceptions
packagepackagecoleo de procedimentos, funes, tipos e
variveis; no exatamente um mdulo, masest relacionado ao assunto
Estrutura do Bloco PL/SQL (Reviso)
-
5/28/2018 Apostila Prog PL SQL
167/295
( )
CabealhoCabealho
IS
Seo de DeclaraoSeo de Declarao
BEGIN
Seo de ExecuoSeo de Execuo
EXCEPTION
Seo deExceptionsSeo deExceptions
END;
DECLARE
Seo de DeclaraoSeo de Declarao
BEGIN
Seo de ExecuoSeo de Execuo
EXCEPTION
Seo deExceptionsSeo deExceptions
END;
Estrutura de Blocos PL/SQL
-
5/28/2018 Apostila Prog PL SQL
168/295
PROCEDURE contratar(nome_in IN VARCHAR2)
IS
data_contratacao DATE;
BEGINdata_contratacao := SYSDATE - 2;
INSERT INTO empregado (nome, data_contratacao)
VALUES (nome_in, data_contratacao);
WHEN DUP_VAL_IN_INDEX
THEN
DBMS_OUTPUT.PUT_LINE( No inseriu );
EXCEPTION
END;
Escopo (Reviso)
-
5/28/2018 Apostila Prog PL SQL
169/295
p ( )
DECLARE
data_contratacao DATE;
BEGIN
END;
DECLARE
data_contratacao DATE;
BEGIN
END;
DECLARE
total_vendas NUMBER;
BEGIN
END;
DECLARE
total_vendas NUMBER;
BEGIN
END;
escopo de
total_vendas
escopo de
total_vendas
escopo de
data_contratacao
escopo de
data_contratacao
Proced imentos
-
5/28/2018 Apostila Prog PL SQL
170/295
Proced imentos
EstruturaPROCEDURE < nome> [ (parmetro [ ,PROCEDURE < nome> [ (parmetro [ ,parmetro ...] ) ]parmetro ...] ) ]
ISIS [comandos de declarao][comandos de declarao]BEGINBEGIN
< comandos>
[ EXCEPTION[ EXCEPTION< comandos para manuseio de< comandos para manuseio deexceptionsexceptions> ]> ]END [nome];END [nome];
Proced imentos
-
5/28/2018 Apostila Prog PL SQL
171/295
Proced imentos
Chamadaum procedimento chamado da mesmaum procedimento chamado da mesmamaneira que um comando PL/SQLmaneira que um comando PL/SQL
aplicar_desconto(nova_empr_id, 15.00);
Proced imentos
-
5/28/2018 Apostila Prog PL SQL
172/295
Proced imentos
Cabealhonome do procedimento e lista de parmetrosnome do procedimento e lista de parmetros
PROCEDURE aplicar_desconto(empr_id_in IN
empresa.empr_id%TYPE, desconto_in INNUMBER)Corpo
cdigo necessrio para a execuo docdigo necessrio para a execuo doprocedimentoprocedimento
PROCEDURE nada ISBEGIN
NULL;END;
Ex emplo de Procedure
-
5/28/2018 Apostila Prog PL SQL
173/295
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;
Funes
-
5/28/2018 Apostila Prog PL SQL
174/295
Funes
EstruturaFUNCTION nome [ (parmetro [, parmetroFUNCTION nome [ (parmetro [, parmetro...] ) ]...] ) ]
RETURN tipo_retornadoRETURN tipo_retornadoISIS[comandos de declarao][comandos de declarao]
BEGINBEGIN
comandoscomandos[ EXCEPTION[ EXCEPTIONcomandos para manuseio decomandos para manuseio de exceptionsexceptions]]
END [nome]END [nome]
Funes
-
5/28/2018 Apostila Prog PL SQL
175/295
Funes
Chamadauma funo chamada como parte de umuma funo chamada como parte de umcomando, sempre que uma expresso podecomando, sempre que uma expresso podeser usadaser usada
vendas_95 := total_vendas( Marisol , 1995);DECLARE
vendas_95 NUMBER DEFAULT
total_vendas( Marisol , 1995);IF total_vendas( Marisol , 1995)
THEN ...
Funes
-
5/28/2018 Apostila Prog PL SQL
176/295
Funes
Cabealhonome da funo, lista de parmetros enome da funo, lista de parmetros etipo do retornotipo do retorno
FUNCTION total_vendas(nome_in INempresa.nome%TYPE, ano_in pedido.ano%TYPE)RETURN NUMBER;
Corpocdigo necessrio para a execuo da funocdigo necessrio para a execuo da funo
FUNCTION nada RETURN BOOLEAN ISBEGIN
RETURN TRUE;END;
Declarao RETURN
-
5/28/2018 Apostila Prog PL SQL
177/295
Encerra a execuo da funo e retorna ovalor para o programa que a chamou.
Um subprograma pode conter vriasdeclaraes RETURN.Em procedures a declarao RETURN nodeve conter uma expresso.
Em funes a declarao RETURN deveconter uma expresso que executada nomomento da execuo da declarao.
Exemplo de Funo
-
5/28/2018 Apostila Prog PL SQL
178/295
FUNCTION sal_ok (salary REAL, title REAL) RETURN BOOLEANIS
min_sal REAL;max_sal REAL;
BEGINSELECT losal, hisal INTO min_sal, max_salFROM salsWHERE job = title;RETURN (salary >= min_sal) AND (salary
-
5/28/2018 Apostila Prog PL SQL
179/295
Parmet ros
Modo de troca de informaes entre omdulo e o bloco PL/SQL que o chamou.
Quando declaramos um parmetro, nuncaespecificamos restries quanto aotamanho do tipo de dado.
PROCEDURE mostra_empresa(nome INPROCEDURE mostra_empresa(nome IN
VARCHAR2) ISVARCHAR2) IS permitida a utilizao de %TYPE e%ROWTYPE na declarao de parmetros
Modo de Passagem de Parmetros
-
5/28/2018 Apostila Prog PL SQL
180/295
INsomente para leiturasomente para leitura
OUTsomente para escrita (o mdulo pode atribuirsomente para escrita (o mdulo pode atribuirum valor ao parmetro, que ser passado aoum valor ao parmetro, que ser passado aobloco PL/SQL que o chamou)bloco PL/SQL que o chamou)
IN OUTusado para leitura e escritausado para leitura e escrita
Passagem de Parmetros
-
5/28/2018 Apostila Prog PL SQL
181/295
PROCEDURE combine_formate_nomes (prim_nome IN OUT VARCHAR2,ult_nome IN OUT VARCHAR2,nome_comp OUT VARCHAR2,
formato IN VARCHAR2 := ULTIMO PRIMEIRO )-- O parmetro formato no precisa obrigatoriamente ser informado
ISBEGIN
IF formato = ULTIMO PRIMEIRO THENnome_comp := ult_nome | | , | | prim_nome
ELSIF formato = PRIMEIRO ULTIMO THEN
nome_comp := prim_nome | | | | ult_nome;END IF;
END;
Como o PL/SQL faz a associao dosparmet ros?
-
5/28/2018 Apostila Prog PL SQL
182/295
parmet ros?
Notao Posicionalassocia o valor ao parmetro correspondenteassocia o valor ao parmetro correspondenteimplicitamente atravs da posioimplicitamente atravs da posio
Notao por Nome Explicitamenteassocia um valor a um parmetroassocia um valor a um parmetroexplicitamente atravs do seu nomeexplicitamente atravs 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 );
Stored Procedures/Funct ions
-
5/28/2018 Apostila Prog PL SQL
183/295
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 dicionrio de dadosfica armazenada no dicionrio de dados
pode ser usada por vrios usuriospode ser usada por vrios usurios
Stored Procedures/Funct ions
-
5/28/2018 Apostila Prog PL SQL
184/295
CREATE PROCEDURE recupera_emp_reg
(emp_numero IN emp.empno%TYPE,
emp_reg OUT emp%ROWTYPE) ASBEGIN
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
INTO emp_ret
FROM emp
WHERE empno = emp_numero;
END;
Exemplo:
Mdulo Local
-
5/28/2018 Apostila Prog PL SQL
185/295
Procedimento ou funo definido da seode declarao de um bloco PL/SQL.
No pode ser chamado por nenhum outromdulo PL/SQL definido fora do bloco aoqual o mesmo pertence.Vantagens
reduz o tamanho do mdulo, eliminandoreduz o tamanho do mdulo, eliminandocdigos repetitivoscdigos repetitivos
torna o cdigo mais legveltorna o cdigo mais legvel
Exemplo de Mdulos Locais
-
5/28/2018 Apostila Prog PL SQL
186/295
DECLARErent REAL;PROCEDURE raise_rent (increase IN OUT REAL) ISBEGIN
rent := rent + increase;
...END raise_rent;...
BEGIN...raise_rent(rent); indeterminate
Dependncias dos Subprogramas
-
5/28/2018 Apostila Prog PL SQL
187/295
p p g
Subprogramas so dependentes dosobjetos que referenciamCaso algum destes objetos forem
alterados por uma operao DDL, osubprograma fica com status INVALID edeve ser recompiladoALTER {PROCEDURE | FUNCTION} nome COMPILE;
Determinao de dependncia (noINIT.ORA)TimestampTimestampAssinaturaAssinatura
Priv i lgios de Acesso
-
5/28/2018 Apostila Prog PL SQL
188/295
g
Para poder executar um subprograma necessrio ter o privilgio EXECUTE parao objeto.Um subprograma executado utilizandoos privilgios explcitos do seu owner, semconsiderar privilgios de roles.
-
5/28/2018 Apostila Prog PL SQL
189/295
Packages
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
190/295
Uma package um conjunto de objetosPL/SQL que so empacotados com umasintaxe especial de BEGIN-END.Podemos colocar em uma package:
cursorescursores
variveisvariveis
nomes denomes de exceptionsexceptionscomandos TYPEcomandos TYPE
procedimentos e funesprocedimentos e funes
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
191/295
Vantagens de utilizarmos packages:information hidinginformation hiding
projeto orientado a objetosprojeto orientado a objetos
projetoprojeto toptop--downdown
persistncia de objetospersistncia de objetos
melhor performancemelhor performance
In te r face
-
5/28/2018 Apostila Prog PL SQL
192/295
Aplicao
Body
Especificao
DataBasePackage
Est rut u ra de uma Pac k age
-
5/28/2018 Apostila Prog PL SQL
193/295
Especificaocontm as definies e especificaes decontm as definies e especificaes detodos os elementos em umatodos os elementos em uma packagepackage queque
podem ser referenciados fora dela.podem ser referenciados fora dela.PACKAGE nome_package IS
[ declaraes de variveis e tipos ][ declaraes de cursores ]
[ declaraes de mdulos ]END [nome_package];
Est rut u ra de uma Pac k age
-
5/28/2018 Apostila Prog PL SQL
194/295
Corpocontm implementao de mdulos, cursorescontm implementao de mdulos, cursorese outros objetose outros objetos
PACKAGE BODY nome_package IS[ declaraes de variveis e tipos ][ especificaao de comandos SELECT de cursores ][ especificao do corpo de mdulos ][ BEGIN
comandos executveis ][ EXCEPTION
exception handlers ]END [nome_package];
Ex e m plo Pac k a ge - Espec i f ic a o
-
5/28/2018 Apostila Prog PL SQL
195/295
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
-
5/28/2018 Apostila Prog PL SQL
196/295
CREATE PACKAGE BODY emp_actionsASCURSOR desc_salary RETURNEmpRecTyp 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);
ENDhire_employee;PROCEDURE fire_employee (emp_id NUMBER)IS
BEGINDELETE FROM emp WHERE empno =emp_id;
ENDfire_employee;ENDemp_actions;
Packages e Escopo
-
5/28/2018 Apostila Prog PL SQL
197/295
Objetos declarados na PackageSpecification tm escopo pblico,podendo ser utilizados fora da packagenome_da_package.nome_do_subprograma (...)nome_da_package.nome_do_tipo
Aqueles objetos definidos somente noPackage Body tm escopo privado,podendo somente ser utilizados poroutros objetos dentro da package
Over load ing de Mdulos
-
5/28/2018 Apostila Prog PL SQL
198/295
FUNCTION valor_ok(numero_in IN NUMBER)
RETURN BOOLEANIS
BEGIN
RETURN numero_in > 0;
END;
FUNCTION valor_ok(data_in IN DATE)
RETURN BOOLEAN
IS
BEGINRETURN date_in
-
5/28/2018 Apostila Prog PL SQL
199/295
Onde Fazer?na seo de declarao de um bloco PL/SQLna seo de declarao de um bloco PL/SQL
dentro de umdentro de um packagepackage
No podemos fazer a sobrecarga denomes de programas independentes,muito menos criar dois mdulos
independentes com o mesmo nome elistas de parmetros distintas.
Exemplo
-
5/28/2018 Apostila Prog PL SQL
200/295
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 izao de Packages
-
5/28/2018 Apostila Prog PL SQL
201/295
Uma package pode conter um conjuntode instrues a serem executadassomente quando a mesma carregadapara a memria
CREATE OR REPLACE PACKAGE BODY nome_CREATE OR REPLACE PACKAGE BODY nome_packpack ASAS
......
BEGINBEGIN
----Cdigo de inicializaoCdigo de inicializao
......
END nome_END nome_packpack;;
Dependncias de Packages
-
5/28/2018 Apostila Prog PL SQL
202/295
O Package Body depende da PackageSpecification e dos objetos referenciadosA Package Specification no depende denadaVises para dependncias no PL/SQL 8.0:
useruser__dependenciesdependencies
allall__dependenciesdependenciesdbadba__dependenciesdependencies
Uti l izao de Stored Funct ions eminstrues SQL
-
5/28/2018 Apostila Prog PL SQL
203/295
Uma funo independente ou contidanuma package pode ser chamada numainstruo SQL, dependendo das restries
de refernciaRestries de Referncia: definem quaistipos de estruturas de dados que a funol ou modifica
WNDS (WNDS (WritesWrites No DatabaseNo Database StateState))RNDS (RNDS (ReadsReads No DatabaseNo Database StateState))WNPS (WNPS (WritesWrites NoNo Package StatePackage State))RNPS (RNPS (ReadsReads NoNo Package StatePackage State))
Ut i l i zao de St o red Func t ions eminstrues SQL
-
5/28/2018 Apostila Prog PL SQL
204/295
Somente para Stored FunctionsParmetros
devem ser somente de entradadevem ser somente de entradano podem utilizar tipos PL/SQL (no podem utilizar tipos PL/SQL (booleanboolean,,recordrecord))
Tipo de retorno da funo tambm tem
que ser um tipo da base de dados
RESTRICT_REFERENCES
-
5/28/2018 Apostila Prog PL SQL
205/295
Para funes independentes o PL/SQLconsegue determinar as restries dereferncia.
Para funes em packages necessriodiscriminar as restries atravs dapragma abaixo. Isto porque os blocosPL/SQL que chamam uma funo
empacotada dependem apenas dapackage specification e no do body.PRAGMA RESTRICT_REFERENCES (nome_funo, WNDSPRAGMA RESTRICT_REFERENCES (nome_funo, WNDS[,WNPS] [,RNDS] [,RNPS]);[,WNPS] [,RNDS] [,RNPS]);
Algum as Pac k ages Pr-Def in idas
-
5/28/2018 Apostila Prog PL SQL
206/295
Nome Descrio
DBMS_DDL execuo de comandos DDL
DBMS_JOB submete e gerencia jobs programados
dentro do databaseDBMS_OUTPUT mostra sadas de programas PL/SQL
no terminal
DBMS_SNAPSHOT gerenciamento de snapshots
DBMS_SQL construo de SQLs dinmicos
UTL_FILE permite que programas PL/SQL leiame escrevam em arquivos
Exercc io I I I .1
-
5/28/2018 Apostila Prog PL SQL
207/295
Converta o script criado no exerccio I .2(razes de uma equao do 2o grau) paraum procedimento.
Armazene este procedimento no banco.
Exercc io I I I .2
-
5/28/2018 Apostila Prog PL SQL
208/295
Converta o script do exerccio II .1 (trsdepartamentos com maior folha - soma desalrios) para um procedimento.
Ao invs de mostrar as informaes natela, insira-as em uma tabela.Armazene este procedimento no banco
(stored procedure).
Exercc io I I I .3
-
5/28/2018 Apostila Prog PL SQL
209/295
Converta o script do exerccio I I .2 (clculodo imposto renda) para uma funo, quereceba como parmetro a matrcula do
funcionrio e retorne o imposto a serpago.Armazene esta funo no banco (stored
function).
Exercc io I I I .4
-
5/28/2018 Apostila Prog PL SQL
210/295
Construa uma package contendo as funes/ procedimentos do departamento pessoal.Armazene esta package no banco de dados
Oracle.Salrio Lquido = SAL+ COMM - Imposto deRendaCOMM = Se o JOB= CLERK, comisso =
1.03 * SALGravar em Contra-Cheque (salrio normal,comisso, imposto de renda e salrioLquido)
-
5/28/2018 Apostila Prog PL SQL
211/295
Tr iggers
Tr iggers
-
5/28/2018 Apostila Prog PL SQL
212/295
Correspondem a stored procedures, coma diferena que os triggers so disparadosautomaticamente quando houver
operaes de insert, update e delete nastabelas associadas.
Tr iggers
-
5/28/2018 Apostila Prog PL SQL
213/295
As aplicaes de triggers incluem:clculo automtico de colunasclculo automtico de colunas
crtica de transaescrtica de transaes
garantia de regras de segurana complexasgarantia de regras de segurana complexas
garantia de integridade referencial em bancosgarantia de integridade referencial em bancosde dados distribudosde dados distribudos
implementao de regras de negcioimplementao de regras de negciocomplexascomplexas
Sin taxe
-
5/28/2018 Apostila Prog PL SQL
214/295
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
-
5/28/2018 Apostila Prog PL SQL
215/295
a especificao da ao que levar aoacionamento do trigger, podendo ser:
INSERTINSERT
UPDATEUPDATEDELETEDELETE
Tr igger Rest r ic t ion
-
5/28/2018 Apostila Prog PL SQL
216/295
uma expresso que limita a execuode um trigger.Deve resultar em valor TRUE ou FALSE.O trigger somente ser executado paravalores TRUE.
Tr igger Ac t ion
-
5/28/2018 Apostila Prog PL SQL
217/295
um bloco PL/SQL que ser executadoquando o trigger for acionado.
T ipos de Triggers
-
5/28/2018 Apostila Prog PL SQL
218/295
ROW TRIGGERSso executados uma vez para cada linhaso executados uma vez para cada linhada tabela afetada pelo comando SQL.da tabela afetada pelo comando SQL.
STATEMENT TRIGGERSso executados apenas uma vez para cadaso executados apenas uma vez para cadacomando SQL que afete a tabelas,comando SQL que afete a tabelas,
independentemente do nmero de linhasindependentemente do nmero de linhasenvolvidas.envolvidas.
Ac ionamen to de Triggers
-
5/28/2018 Apostila Prog PL SQL
219/295
Quando definimos um trigger, podemosespecificar quando ele ser acionado:
before rowbefore row
before statementbefore statementafter rowafter row
after statementafter statement
Triggers (Ex emp lo)
-
5/28/2018 Apostila Prog PL SQL
220/295
CREATE TRIGGER dummyBEFORE DELETE OR INSERT OR UPDATE ON empFOR EACH ROWWHEN (new.empno > 0)
DECLARE/* variveis, constantes, cursores, etc. * /
BEGIN/* bloco PL/SQL * /
END;
L im i t e de T ri gger s por Tabela
-
5/28/2018 Apostila Prog PL SQL
221/295
Um de cada tipo, totalizando at 12triggers. No entanto no PL/SQL 2.1 umatabela pode ter mais de um trigger decada tipo.
BEFORE UPDATEBEFORE UPDATE rowrow AFTER UPDATEAFTER UPDATE rowrow
BEFORE DELETEBEFORE DELETE rowrow AFTER DELETEAFTER DELETE rowrow
BEFORE INSERTBEFORE INSERT statementstatement AFTER INSERTAFTER INSERT statementstatement
BEFORE INSERTBEFORE INSERT rowrow AFTER INSERTAFTER INSERT rowrowBEFORE UPDATEBEFORE UPDATE statementstatement AFTER UPDATEAFTER UPDATE statementstatement
BEFORE DELETEBEFORE DELETE statementstatement AFTER DELETEAFTER DELETE statementstatement..
Tr iggers instead-of
-
5/28/2018 Apostila Prog PL SQL
222/295
Em PL/SQL 8.0, podem ser definidostriggers que sero disparados em vez dainstruo DML que os disparou
Somente para visesA nvel de linhaExemplo:
Para eliminar linhas de umaPara eliminar linhas de uma viewview complexacomplexa
Pseudo-registros
-
5/28/2018 Apostila Prog PL SQL
223/295
Disponvel para triggers a nvel de linha:old
valores originais do registro da tabelavalores originais do registro da tabela
somente para leitura no corpo dosomente para leitura no corpo do triggertrigger
:newvalores do registro que sero inseridos ouvalores do registro que sero inseridos ou
atualizados na base de dadosatualizados na base de dadospodem ser atribudos valores (somentepodem ser atribudos valores (somentequandoquando beforebefore))
Clusula WHEN
-
5/28/2018 Apostila Prog PL SQL
224/295
Vlida para triggers a nvel de linhaO corpo do trigger ser executado para aslinhas que a condio especificadaresultar em TRUEOs pseudo-registros :old e :new podemser utilizados dentro da condio, mas os
dois pontos devem ser suprimidos
Predicados de Tr igger
-
5/28/2018 Apostila Prog PL SQL
225/295
Usados em triggers disparados paradiferentes tipos de instrues de DMLFunes booleanas que identificam ainstruo que disparou o trigger
INSERTINGINSERTING
UPDATINGUPDATING
DELETINGDELETING
-
5/28/2018 Apostila Prog PL SQL
226/295
Tratamento de Erros
Conce i tos
-
5/28/2018 Apostila Prog PL SQL
227/295
Uma exception uma situao que nodeveria 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 ao do usurioerro causado por uma ao do usurio
aviso gerado pela aplicao e direcionado aoaviso gerado pela aplicao e direcionado aousuriousurio
Ex c ept ion Handlers
-
5/28/2018 Apostila Prog PL SQL
228/295
Este mecanismo permite separar o cdigode processamento de erros do resto doscomandos.
Oferece um modelo orientado a eventos.No importa como uma exception foigerada, ela ser tratada na mesma seo
(exception section).
Desvio do Fluxo
-
5/28/2018 Apostila Prog PL SQL
229/295
PROCEDURE fluxoIS
novo_valor VARCHAR2(5);BEGIN
novo_valor := valor_antigo || -novo ;
IF novo_valor LIKE open%
THEN
...
END IF;
EXCEPTIONWHEN VALUE_ERROR
THEN ...
END;
T ipos de Ex c ept ions
-
5/28/2
top related