Apostila Prog PL SQL

download Apostila Prog PL SQL

of 295

description

Programação PL/SQL

Transcript of Apostila Prog PL SQL

  • 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