PLSQL

295
Programação em PL/SQL

Transcript of PLSQL

  • Program a o em PL/SQL

  • Est rut ura do Curso

    Introduo a PL/SQLConceitos Bsicos de PL/SQLVariveis e Dados de ProgramaControle Condicional e SequencialLoopsRegistros em PL/SQLTabelas PL/SQL

  • Est rut ura do Curso

    SQL em PL/SQLFunes de SQL integradasCursoresProcedimentos e FunesPackagesTriggersTratamento de Erros

  • Est rut ura do Curso

    Testes e DepuraoPL/SQL DinmicoEntrada e Sada em ArquivosDesempenho e Otimizao

  • PL/SQL

    Procedural Language extensions to SQL.Usamos esta linguagem no Oracle Servere em aplicaes-cliente (p.e. Oracle Forms).Adiciona construes de programao no existentes na linguagem de banco de dados padro.Permite a combinao de comandos SQL com construes procedurais.

  • Verses do PL/SQL

    Verso 2.0 - Oracle 7.0Verso 2.1 - Oracle 7.1Verso 2.2 - Oracle 7.2Verso 2.3 - Oracle 7.3Verso 8.0 - Oracle 8.0

    Verso 1.1 -Developer/2000Verso 8.0 -Developer 6

    Cliente Servidor

  • Arqui t e t ura do PL/SQL

    Oracle Forms

    Geradorde SQL

    Programa PL/SQL local

    PL/SQL V8.0Runtime Engine

    Oracle Server

    Processador de comandos

    SQL

    Stored Program Unit

    PL/SQL V8.0Runtime Engine

  • Am bient es de Ex ec u o

    ServidorOracle Oracle 7: PL/SQL verso 27: PL/SQL verso 2Oracle Oracle 8: PL/SQL verso 88: PL/SQL verso 8SQL*SQL* Plus Plus (modo interativo)(modo interativo)

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

    utilizam compiladores PL/SQL prprios

  • Conc ei t os Bsic os daLinguagem PL/SQL

  • Charac t er Set do PL/SQL

    Tipo CaracteresLetras A-Z, a-zDgitos 0-9Smbolos ~ ! @ # $ % & * ( ) _

    - + = | [ ] { } : ; < >, . ? /

    Espao em Branco Tab, espao, Enter

  • Charac t er Set do PL/SQL

    O PL/SQL no uma linguagem sensvel ao contexto.

    letras maisculas so tratadas da mesma letras maisculas so tratadas da mesma maneira que minsculas, a no ser no caso maneira que minsculas, a no ser no caso destas pertencerem a uma cadeia de destas pertencerem a uma cadeia de caracteres.caracteres.

    If x < > s thenIf x < > S then

  • Sm bolos Sim ples e Com post osS m b o lo D escr i o; te rm in ad o r d e co m an d o s

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

    _ sm b o lo w ild ca rd: in d icad o r d e v ariv e l h o sp ed e ira* * o p erad o r ex p o n en c ia l< > e != d ife ren te| | o p e rad o r d e co n ca ten ao< < e > > d e lim itad o r d e r tu lo< = e > = m en o r o u igu a l e m a io r o u igu a l:= o p erad o r d e a trib u io= > o p erad o r d e asso c iao p a ra

    n o tao p o s ic io n a l-- co m en t rio em u m a n ica d e lin h a/* e * / in c io e fim d e co m en t rio

  • Charac t er Set do PL/SQL

    Caracteres so agrupados, formando unidades lxicas, que so os menores componentes individuais da linguagem.Uma unidade lxica pode formar:

    identificadoresidentificadoresliteraisliteraisdelimitadoresdelimitadorescomentrioscomentrios

  • Ident i f ic adores

    Identificador um nome para um objeto PL/SQL.

    constante, varivel,constante, varivel, exceptionexception, procedimento, , procedimento, funo,funo, packagepackage, registro, tabela PL/SQL, cursor , registro, tabela PL/SQL, cursor e palavra reservada.e palavra reservada.

    At 30 caracteres.Tem que comear com uma letra.Pode incluir $, _ e # .No pode conter espaos.

  • Li t era is

    Literal um valor no representado por um identificador; simplesmente um valor.Nmero

    415, 21.6 ou NULL415, 21.6 ou NULLString

    Esta uma frase , 01Esta uma frase , 01--0303--97 ou NULL97 ou NULLBoolean

    TRUE, FALSE ou NULLTRUE, FALSE ou NULL

  • Del im i t adores

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

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

  • Com ent r ios

    Comentrio de uma nica linhaIFIF salariosalario < min_< min_salariosalario(1994) (1994) ---- retorna min salrio do anoretorna min salrio do anoTHENTHEN

    salariosalario :=:= salariosalario * .25;* .25;END IF;END IF;

    Comentrio de mltiplas linhasPROCEDURE calcula_receita (empresa IN NUMBER) ISPROCEDURE calcula_receita (empresa IN NUMBER) IS/* Programa alterado em 23/9/94/* Programa alterado em 23/9/94

    Analista Responsvel: Manoel de Souza * /Analista Responsvel: Manoel de Souza * /......

  • Est rut ura de um Bloc o

    A estrutura da linguagem PL/SQL orientada a blocosModularizao

    um bloco a unidade bsica de trabalho da um bloco a unidade bsica de trabalho da qual procedimentos e funes so construdosqual procedimentos e funes so construdos

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

  • Se es de um Bloc o

    Cabealho (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 e blocos e sees de exceosees de exceo

    Seo de Execuoparte que contm o cdigo a ser executadoparte que contm o cdigo a ser executado

    Seo de Excees (Exceptions)manipula excees ao processamento normal manipula excees ao processamento normal (condies de aviso e erro).(condies de aviso e erro).

  • Se es de um Bloc o

    CabealhoCabealhoIS

    Seo de DeclaraoSeo de Declarao

    BEGIN

    Seo de ExecuoSeo de Execuo

    EXCEPTION

    Seo de ExceptionsSeo de Exceptions

    END;

  • Se es de um Bloc o

    Blocos AnnimosNo possuem nomeNo possuem nome DECLARE

    Seo de DeclaraoSeo de Declarao

    BEGIN

    Seo de ExecuoSeo de Execuo

    EXCEPTION

    Seo de ExceptionsSeo de Exceptions

    END;

  • Bloc os Aninhados

    Um bloco pode conter um ou mais sub-blocos de cdigo.

    As variveis dos blocos As variveis dos blocos externos podem ser externos podem ser referenciadas nos referenciadas nos blocos internos, porm blocos 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;

  • Var iveis e Dados de Program a

  • Var ive is

    Atributos de uma varivelnome, tipo e valornome, tipo e valor

    NomePode ter at 30 caracteresPode ter at 30 caracteresTem que comear com uma letraTem que comear com uma letra

    ConstanteTipo especial de varivelTipo especial de varivelValor constanteValor constante

  • Tipos de Dados

    Nmero BINARY_INTEGERDECDECIMALDOUBLE PRECISIONFLOATINTINTEGERNATURALNUMBERPOSITIVEREALSMALLINT

    Caractere CHARCHARACTERLONGLONG RAWRAWROWIDSTRINGVARCHARVARCHAR2

    Boleano BOOLEANData-hora DATE

  • Tipos de Dados

    Existem no banco de dados: Number, Char, Long, Long Raw, Raw, Rowid, Varchar2, Date.Binary_Integer: Utilizado para armazenar inteiros com sinal. Com intervalo de: -2147483647 .. 2147483647Subtipos:

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

  • Tipos de Dados Num r ic os

    Utilize NUMBER para armazenar nmeros (inclusive ponto-flutuante)Preciso Mxima: 38 dgitos

    1.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 ou escala: nmero de dgitos a direita ou

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

  • Tipos de Dados Num r ic os

    Se a escala positiva, ento a escala determina que o ponto onde o arredondamento ocorre est a direita do ponto decimal.Se a escala negativa, ento a escala determina que o ponto onde o arredondamento ocorre est a esquerda do ponto decimal.Se a escala zero, ento o arredondamento ocorre para a parte inteira do nmero.Se a escala no especificada, ento o arredondamento no ocorre.

  • VALOR FORMATO RESULTADO12345.6784 NUMBER(10,3) 12345.6781234567891.23 NUMBER(10,3) ERROR1567899 NUMBER(10,-6) 200000053.35 NUMBER(10,-6) 0

    EXEMPLO:

    Tipos de Dados Num r ic os - Ex em plos

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

    Subtipo Compatibilidade Correspondente noOracle

    DEC (prec, esc) ANSI NUMBER(prec, esc)DECIMAL(prec, esc) IBM NUMBER(prec, esc)DOUBLEPRECISION

    ANSI NUMBER

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

  • Carac t eres

    CHARSubtipos: Subtipos: Character Character e string.e string.especifica que a varivel tem um tamanho fixoespecifica que a varivel tem um tamanho fixopodepode--se especificar o tamanho mximo (1 at se especificar o tamanho mximo (1 at 32767)32767)se o tamanho no for especificado, o valor padro se o tamanho no for especificado, o valor padro 1 (um). 1 (um).espaos em branco so adicionados ao final da espaos em branco so adicionados ao final da varivel, se esta armazenar uma cadeia de varivel, se esta armazenar uma cadeia de caracteres de tamanho menor que o mximo.caracteres de tamanho menor que o mximo.

  • Carac t eres

    VARCHAR2 e VARCHARarmazenam cadeias de caractere de tamanho armazenam cadeias de caractere de tamanho varivel.varivel.podepode--se especificar o tamanho mximo (1 at se especificar o tamanho mximo (1 at 32767)32767)VARCHAR2 e VARCHAR so sinnimos VARCHAR2 e VARCHAR so sinnimos (visando a compatibilidade com bancos de (visando a compatibilidade com bancos de dados ANSI).dados ANSI).Recomendao daRecomendao da OracleOracle: utilize VARCHAR2: utilize VARCHAR2

  • Carac t eres

    LONGarmazenam cadeias de caractere de tamanho armazenam 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 byteso 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

  • Row id

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

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

  • Booleano (BOOLEAN)

    Tipo de dados lgico (no existe correspondente no servidor Oracle).Pode assumir os valores TRUE, FALSE ou NULL.

  • Dat a-hora (DATE)

    Uma varivel do tipo DATE armazena tanto informaes sobre data quanto sobre hora.Valor de tamanho fixo, que ocupa 7 bytes.DATE armazena as seguintes informaes:

    sculo, ano, ms, dia, hora, minuto e sculo, ano, ms, dia, hora, minuto e segundosegundoDatas vlidas para uma varivel data esto Datas vlidas para uma varivel data esto entre 1 jan de 4712 AC a 31 dez de 4712 DC.entre 1 jan de 4712 AC a 31 dez de 4712 DC.

    Podem ser feitas operaes aritmticas sobre um valor do tipo DATE.

  • Converso ent re T ipos

    Sempre que o PL/SQL efetua uma operao envolvendo um ou mais valores, ele primeiro converte os dados para o formato correto para a operao.Converso Explcita

    usada uma funo de converso pr usada uma funo de converso pr--definidadefinidaConverso Implcita

    sempre que necessrio, o PL/SQL tenta converter sempre que necessrio, o PL/SQL tenta converter os valores para efetuar a operaoos valores para efetuar a operao

  • 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 um valor nulo, geralmente recebemos como resultado um outro valor nulo.

    nome := NULL;nome := NULL;IF LENGTH(nome) = 0 THEN IF LENGTH(nome) = 0 THEN ---- No funcionaNo funciona

    Maneira correta da comparao:< identificador> IS NULL< identificador> IS NULL< identificador> IS NOT NULL< identificador> IS NOT NULL

  • Valores Nulos em PL/SQL

    Resultado de funes com argumento NULL:ConcatenaoConcatenao

    Existem duas maneiras de efetuarmos uma concatenao: 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

  • Dec lara o de Var ive is

    Antes de fazer qualquer referncia a uma varivel, a mesma deve ser declarada.Sintaxe

    < nome_var> < tipo> [ atribuio de valor padro]< nome_var> < tipo> [ atribuio de valor padro]

  • Dec lara o de Var ive is

    Exemplosdata_data_admissaoadmissao DATE;DATE;achou BOOLEAN;achou BOOLEAN;total NUMBER(15,2);total NUMBER(15,2);paragrafoparagrafo VARCHAR2(2000);VARCHAR2(2000);proxprox_aumento CONSTANT DATE := 15_aumento CONSTANT DATE := 15--APRAPR--96 ;96 ;limite NUMBER DEFAULT 3;limite NUMBER DEFAULT 3;nomnom__emprempr VARCHAR2(50) NOT NULL DEFAULT VARCHAR2(50) NOT NULL DEFAULT PCS R USPCS R US

  • Cont ro le Condic ional e Sequenc ia l

  • Com andos IF...

    Permitem que seja construda uma lgica condicional nas aplicaes.

    IF THEN - TRUEEND IF;

    Determina se os comandos entre oTHEN e o END IF sero executados,de acordo com a condio.

    IF THEN - TRUEELSE - FALSEEND IF;

    Baseado na condio informada, serexecutado o cdigo entre o THEN e oELSE (TRUE) ou entre ELSE e o ENDIF (FALSE).

    IF ...ELSIF ELSE END IF

    seleciona uma ao dentre vriascondies mutuamente exclusivas,executando os comandos associados condio.

  • Com bina o IF-THEN

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

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

    IFIF relatoriorelatorio_pedido_pedidoTHENTHEN

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

  • Com bina o IF-THEN-ELSE

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

    pedido_excedente := TRUE;pedido_excedente := TRUE;ELSEELSE

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

  • Com bina o IF-ELSIF

    ExemploIFIF salariosalario < 10000 < 10000 THENTHEN

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

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

    bonusbonus := 1000;:= 1000;ELSEELSE

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

  • Com ando GOTO

    Desvio incondicional para um rtulo definido no programa.

    GOTO nome_rotulo;GOTO nome_rotulo;......

    < < nome_rotulo> >< < nome_rotulo> >......

    Pelo menos um comando deve existir aps a definio de um rtulo.O rtulo deve ser nico no escopo.

  • Com ando GOTO

    Rtulo destino deve estar no mesmo escopo que o comando GOTO.

    IF, BEGIN,IF, BEGIN, LoopLoop, mdulo., mdulo.Rtulo destino deve estar na mesma parte do bloco PL/SQL que o comando GOTO.

    ex.: um GOTO na seo executvel no pode ex.: um GOTO na seo executvel no pode desviar para a seo de desviar para a seo de exceptionsexceptions..

    O cdigo resultante com o uso do GOTO pode tornar-se complexo e desestruturado, dificultando a manuteno.

  • Com ando NULL

    Melhorar a clareza do programaIF :IF : reportreport ..selectionselection = DETAIL = DETAIL THENTHEN

    execexec__detaildetail__reportreport ;;ELSEELSE

    NULL;NULL;END IF;END IF;

    Tirar o efeito de uma exceptionProjeto top-down dos mdulos do sistema.Utilizao conjunta com o GOTO.

  • SQL* Plus

  • SQL* Plus

    Permite introduzir interativamente instrues de SQL e blocos PL/SQL a partir de uma linha de comandos que so enviadas diretamente para a base de dadosComandos no so sensveis a maisculas e minsculas

  • Var ive is de Subst i t u i o

    Identificadas pelo caracter &Substituio textual da varivel antes de enviar a instruo para o servidorExemplo:

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

  • Var ive is de Assoc ia o

    Variveis de memria, podendo ser utilizadas em um ou mais blocos PL/SQLTipos vlidos:

    VARCHAR2VARCHAR2CHARCHARNUMBERNUMBER

    No podem ser restringidas por preciso ou escala

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

  • Var ive is de Assoc ia o

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

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

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

    SQL> PRINT v_contadorSQL> PRINT v_contadorAps a execuo, a varivel v_contador Aps a execuo, a varivel v_contador conter o resultado do conter o resultado do select select feito no bloco.feito no bloco.

  • EXECUTE

    Uma chamada a stored procedures deve ser feita atravs do comando EXECUTEExemplo:

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

  • Ex ec ut ar Arqu ivos de Inst ru es

    Para executar quaisquer instrues SQL ou blocos PL/SQLPode-se utilizar start ou @Exemplos:

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

    A extenso default sql

  • SHOW ERRORS

    Mostra erros de compilao armazenados na view user_errorsUtilizado aps uma tentativa de criar stored procedures e receber a mensagem:WarningWarning: : Procedure created with compilation errorsProcedure created with compilation errors

  • Ex erc c io I .1

    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 SQRTutilize 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 annimoutilize o comando DBMS_OUTPUT.PUT_LINEutilize o comando DBMS_OUTPUT.PUT_LINE

  • Ex erc c io I .2

    Faa um script que calcule as razes de uma equao de 2o grauSugestes:

    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.araiz2 = ( raiz2 = ( --b b -- sqrtsqrt(b(b22 -- 4.a.c) ) / 2.a4.a.c) ) / 2.a

  • Loops

  • Conc ei t os

    Um loop permite que um mesmo cdigo seja executado repetidamente.

    LoopLoop SimplesSimplesLoopLoop FOR (p/ nmeros e cursores)FOR (p/ nmeros e cursores)LoopLoop WHILEWHILE

    Na maioria dos casos, uma lgica que requer um loop pode usar qualquer das trs construes existentes.

  • Loop Sim ples

    LOOP< comandos>

    END LOOP;

    O teste para terminao feito dentro doloop

    EXIT EXIT EXIT WHEN < condio>EXIT WHEN < condio>

  • Loop Sim ples

    ExemplosLOOP

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

    EXIT;ELSE

    aplicar_balanco(conta_id, balanco_restante);END IF;

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

    aplicar_balanco(conta_id, balanco_restante);END LOOP;

  • Loop Sim ples

    Quando usarno existe a certeza de quantas vezes ono existe a certeza de quantas vezes o looploop ser ser executadoexecutadooo looploop deve executar pelo menos uma vezdeve executar pelo menos uma vez

  • Loop FOR

    FOR numricoFOR IN [REVERSE] < menor> ..< maior>> IN [REVERSE] < menor> ..< maior>LOOPLOOP

    < comandos>< comandos>END LOOP;END LOOP;OO looploop termina quando o cdigo executado o termina quando o cdigo executado o nmero de vezes correspondente ao intervalo nmero de vezes correspondente ao intervalo informadoinformadoAps cada execuo do bloco, o PL/SQL verifica Aps cada execuo do bloco, o PL/SQL verifica se o valor atual do ndice excede a diferena se o valor atual do ndice excede a diferena entre o maior e menor nmero informado na faixaentre o maior e menor nmero informado na faixa

  • Loop FOR

    FOR numricoQuando usar:Quando usar:

    cdigo dentro do loop ser executado um nmero fixo de 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

  • Loop FOR

    FOR numricoExemplosExemplos

    FOR contador IN 1..10LOOP

    ...

    END LOOP;

    FOR contador IN REVERSE 1..10LOOP

    ...

    END LOOP;

    FOR ind_calc IN ini_periodo .. LEAST(fim_periodo,

    periodo_atual) LOOP

    ...

    END LOOP;

  • Loop WHILE

    WHILE < condio>LOOP

    < comandos>END LOOP;Executa at que a condio seja falsa.Antes de cada execuo do bloco dentro loop, o PL/SQL avalia a condio informada.

  • Loop WHILE

    Quando usarno temos certeza de quantas vezes devemos no temos certeza de quantas vezes devemos executar o corpo doexecutar o corpo do looploopdesejamos interromper odesejamos interromper o looploop de acordo com de acordo com uma condiouma condiono necessariamente temos que executar ono necessariamente temos que executar o looplooppelo menos uma vezpelo menos uma vez

  • Loop WHILE

    WHILE total

  • Regis t ros em PL/SQL

  • Conc ei t os

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

  • Tipos de Regis t ro

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

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

    Definido pelo Programadorcada campo definido explicitamente cada campo definido explicitamente (nome e tipo) atravs do comando TYPE(nome e tipo) atravs do comando TYPE

  • Dec lara o de um Regis t ro

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

    empresa_empresa_regreg empresa%ROWTYPE;empresa%ROWTYPE;Baseado em Cursores

    < nome_< nome_regreg> < nome_cursor> %ROWTYPE;> < nome_cursor> %ROWTYPE;DECLAREDECLARE

    empresa_empresa_regreg empresa_empresa_curcur%ROWTYPE;%ROWTYPE;

  • Dec lara o de um Regis t ro

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

    ( < nome_campo1> < tipo_dado1> ,( < nome_campo1> < tipo_dado1> ,< nome_campo2> < tipo_dado2> ,< nome_campo2> < tipo_dado2> ,......

    < nome_< nome_campoNcampoN> < tipo_> < tipo_dadoNdadoN> )> )

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

  • Tabelas PL/SQL

  • Def in i o

    Como um array, uma tabela PL/SQL uma coleo ordenada de elementos de um mesmo tipo.Uma tabela PL/SQL no tem limites de tamanho, pode ser incrementada dinamicamente.O ndice de acesso da tabela no precisa ser um nmero sequencial. Por exemplo, pode-se usar uma srie como nmero do empregado (como 7369, 7499, 7521, 7566, )

  • Def in indo um a Tabela PL/SQL

    TYPE table_type_name IS TABLE OFdatatype [NOT NULL]

    [INDEX BY BINARY_INTEGER];onde onde tabletable__typetype__namename um tipo especificado um tipo especificado pelo usurio.pelo usurio.

    Na verso 8 a clusula INDEX BY opcional.

  • Ex em plos

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

    INDEX BY BINARY_INTEGER;

    DECLARETYPE TimeRecTyp IS RECORD (

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

    TYPE TimeTabTyp IS TABLE OF TimeRecTypINDEX BY BINARY_INTEGER;

  • Referenc iando Tabelas PL/SQL

    DECLARETYPE EmpTabTyp IS TABLE OF emp%ROWTYPE

    INDEX BY BINARY_INTEGER;emp_tab EmpTabTyp;

    BEGIN...

    IF emp_tab(1).job = CLERK THEN ...END;

  • Usando Tabelas PL/SQL

    DECLARETYPE DeptTabTyp IS TABLE OF dept%ROWTYPE

    INDEX BY BINARY_INTEGER;dept_tab DeptTabTyp;

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

    ...

    END;

  • Usando Tabelas PL/SQL

    DECLARETYPE EmpTabTyp IS TABLE OF emp%ROWTYPE

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

    BEGINOPEN c1;LOOP

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

    process data recordEND LOOP;CLOSE c1;

    END;

  • At r ibut os de Tabela: COUNT

    Retorna o nmero de elementos na tabela.

    ...

    IF ename_tab.COUNT = 50 THEN...

    END;

  • At r ibut os de Tabela: DELETE

    Este atributo tem 3 formas:tabela.DELETE remove todos os elementos da tabela.DELETE remove todos os elementos da tabela;tabela;tabela.DELETE(n) remove o elemento n da tabela.DELETE(n) remove o elemento n da tabela;tabela;tabela.DELETE(m,n) remove o range m .. n.tabela.DELETE(m,n) remove o range m .. n.

    uma instruo completa por si s; no chamada como parte de uma expresso

  • At r ibut os de Tabela: EXISTS

    Retorna TRUE se existir uma linha com ndice i na tabela, caso contrrio retorna FALSE.

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

    ELSERAISE salary_missing;

    END IF;...

  • At r ibut os de Tabela: FIRST e LAST

    Retornam o ndice da primeira e da ltima linha da tabela, respectivamente....

    FOR i IN emp_tab.FIRST .. emp_tab.LAST LOOP...

    END LOOP;A primeira linha a que tem o ndice mais baixo e a ltima, o mais elevado.

  • At r ibut os de Tabela: NEXT e PRIOR

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

    ...

    i BINARY_INTEGER;BEGIN

    ..

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

    ... process any_tab(i)i := any_tab.NEXT(i);

    END LOOP;END;

  • SQL em PL/SQL

  • Ins t ru es de SQL

    Podem dividir-se em seis categorias:DML: linguagem de manipulao de dadosDML: linguagem de manipulao de dadosDDL: linguagem de definio de dadosDDL: linguagem de definio de dadosControle de transaesControle de transaesControle de sessesControle de sessesControle do sistemaControle do sistemaSQL incorporado (para prSQL incorporado (para pr--compiladores)compiladores)

  • SQL em PL/SQL

    Num programa PL/SQL s podem ser usadas as seguintes instrues:

    DML:DML: selectselect,, insertinsert ,, updateupdate, , deletedeleteControle de transaes: Controle de transaes: commitcommit, , rollbackrollback, , savepointsavepoint

    Existe uma alternativa para o uso de instrues DDL em PL/SQL

    A A package package DBMS_SQL, disponvel a partir da DBMS_SQL, disponvel a partir da verso 2.1 permite a criao de SQL dinmicoverso 2.1 permite a criao de SQL dinmico

  • DML: Selec t

    Busca informaes do banco de dados para variveis PL/SQLSELECT emp.enameINTO v_enameFROM empWHERE emp.empno = 7902;

    Deve retornar somente uma linhaA clusula INTO s usada em blocos PL/SQL

  • DML: Inser t

    Insere uma linha na tabelaINSERT INTO emp

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

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

    INSERT INTO empSELECT * FROM emp;

  • DML: Updat e

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

  • DML: Delet e

    Elimina uma ou mais linhas de uma tabelaDELETE FROM empWHERE empno = 1;

  • Clusula WHERE

    Nas instrues SELECT, UPDATE e DELETE esta clusula serve para restringir o conjunto de linhas sobre as quais a operao ser executada.Constituda por condies, normalmente de comparao, separadas pelos operadores AND, OR, NOT

  • Refernc ias de t abelas

    As operaes de DML referenciam uma tabela, 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

  • Sinnim os

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

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

    owner1.owner1.empemp@bd1;@bd1;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;

  • Pseudo-c o lunas

    Funes adicionais que s podem ser chamadas a partir de instrues SQL:

    CURRVAL e NEXTVALCURRVAL e NEXTVALLEVELLEVELROWIDROWIDROWNUMROWNUM

  • Pseudo-c o lunas: CURRVAL e NEXTVAL

    Utilizadas com sequncias (objetos Oracle para gerar nmeros nicos)sequncia.CURRVAL

    retorna o valor atual da retorna o valor atual da sequnciasequnciasequncia.NEXTVAL

    retorna o prximo valor da retorna o prximo valor da sequnciasequnciaExemplo:SELECT SELECT mymy__seqseq.NEXTVAL .NEXTVAL from from dual;dual;

  • Pseudo-c o lunas: LEVEL

    Utilizado dentro de uma instruo SELECT que implementa uma pesquisa de rvore hierrquica numa tabela utilizando as clusulas START WITH e CONNECT BY. Esta pseudo-coluna retorna o nvel atual da rvore.

  • Pseudo-c o lunas: ROWID

    Retorna o endereo fsico de uma linha da tabela, num valor do tipo ROWIDUm SELECT utilizando-se de ROWID na clusula WHERE o mtodo mais otimizado de se recuperar uma linhaExemplo:v_rowid ROWID;...

    SELECT ROWID INTO v_rowid FROM emp;...

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

  • Pseudo-c o lunas: ROWNUM

    Retorna o nmero atual da linha num SELECTUtilizado principalmente na clusula WHERE para limitar as linhas a serem consideradasSELECT * FROM emp WHERE ROWNUM < 3;O valor ROWNUM atribudo a uma linha antes de ser efetuada uma ordenao (ORDER BY)

  • Pr iv i lg ios de Ac esso

    Privilgios de ObjetoPara efetuar operaes num objetoPrivilgios de SistemaPara efetuar operaes numa classe de objetos

  • GRANT

    Para dar privilgios de acesso Objeto:Objeto:

    GRANT privilgio ON objeto TO usurio[WITH GRANT OPTION]

    Sistema:Sistema:GRANT privilgio TO usurio

    [WITH ADMIN OPTION]

  • REVOK E

    Para revogar privilgios de acessoObjeto:Objeto:

    REVOKE privilgio ON objeto FROM usurio[CASCADE CONSTRAINTS]

    Sistema:Sistema:REVOKE privilgio FROM usurio

  • Per f is de Grupo

    Os privilgios comuns podem ser agrupados em ROLES, para facilitar a concesso para vrios usurios 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 ... TO se 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

  • Cont ro le de Transa es

    COMMITSalva as operaes da transao e libera locks. As operaes so visveis a outras sessesROLLBACKDesfaz as operaes e libera locksSAVEPOINTPonteiro para marcar o nicio para onde um ROLLBACK pode ser efetuado

  • Fun es de SQL in t egradas

  • Fun es para Carac t eres

    Nome DescrioASCII 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 dasubstring especificada

    LENGTH retorna o tamanho da string

    LOWER converte todas as letras para minsculas

    LPAD adiciona uma string esquerda

  • Fun es para Carac t eres

    Nome DescrioLTRIM retira do lado esquerdo da string todos os caracteres recebidos

    como parmetroREPLACE substitui uma sequncia de caracteres por um conjunto

    diferente de caracteresRPAD adiciona os caracteres especificados direita da stringRTRIM retira do lado direito da string todos os caracteres recebidos

    como parmetroSOUNDEX retorna a representao fontica de uma stringSUBSTR retorna a poro especificada da stringTRANSLATE traduz caracteres nicos em uma string por um caracter

    diferenteUPPER converte todas as letras para maisculas

  • Fun es para Carac t eres

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

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

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

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

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

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

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

  • Fun es para Carac t eres

    ExemplosFUNCTION LTRIM(string1 IN VARCHAR2FUNCTION LTRIM(string1 IN VARCHAR2

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

    LTRIM( Eu gosto de pizza ) = > Eu gosto de pizzaFUNCTION SUBSTR(string_in IN VARCHAR2,FUNCTION SUBSTR(string_in IN VARCHAR2,

    pospos__ini ini IN NUMBERIN NUMBER[, tam_[, tam_substrsubstr_in IN _in IN

    NUMBER])NUMBER])RETURN VARCHAR2RETURN VARCHAR2

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

  • Fun es para Dat as

    Nome DescrioADD_MONTHS adiciona o nmero de meses especificado data

    LAST_DAY retorna o ltimo dia do ms da data especificadaMONTHS_BETWEEN retorna o nmero de meses entre duas datasNEW_TIME retorna o valor data/hora, com o tempo alterado

    de acordo com o time zone especificadoNEXT_DAY retorna a data do primeiro dia de semana

    especificado que maior que a data

    ROUND retorna a data arrendondada para o formatoespecificado

    SYSDATE retorna a hora/data corrente no Oracle Server

    TRUNC trunca a data da sua poro hora, de acordo como formato especificado

  • Fun es para Dat as

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

    LAST_DAY(SYSDATE) - SYSDATE = > nmero de dias 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

  • Fun es Num r ic as

    Nome DescrioABS valor absoluto do nmeroCOS / ACOS / COSH cosseno; cosseno inverso; cosseno hiperblicoSIN / ASIN / SINH seno; seno inverso; seno hiperblicoTAN / ATAN TANH tangente; tangente inversa; tangente hiperblicaCEIL retorna o teto inteiro de um nmeroEXP(n) e elevado n-sima potnciaFLOOR maior inteiro menor ou igual ao nmeroLN(a) logaritmo natural de a.LOG(a, b) logaritmo na base a de b.MOD(a, b) resto da diviso de a por b.

  • Fun es Num r ic as

    Nome DescrioPOWER(a,b) a elevado b-sima potnciaROUND(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

  • Out ras Fun es

    Nome DescrioDECODE retorna o resultado de uma comparao no estilo if-then-elseDUMP retorna uma string contendo um dump da expresso especificadaGREATEST retorna o maior dos valores especificadosLEAST retorna o menor dos valores especificadosNVL substitui o valor NULL por um outro valorSQLCODE retorna o nmero do erro do Oracle para a exception mais recenteSQLERRM retorna a mensagem de erro do Oracle para a exception mais

    recenteUID retorna o User ID da sesso corrente no OracleUSER retorna o nome do usurio logadoUSERENV retorna uma string contento infos sobre a sesso corrente no OracleVSIZE retorna o nmero de bytes da representao interna do valor

    especificado

  • Out ras Fun es

    ExemplosFUNCTION SQLCODE RETURN INTEGERFUNCTION SQLCODE RETURN INTEGERFUNCTION SQLERRM RETURN VARCHAR2FUNCTION SQLERRM RETURN VARCHAR2

    EXCEPTIONWHEN OTHERS THEN

    MESSAGE( Error | | TO_CHAR(SQLCODE) | | : | | SQLERRM);

  • Fun es de Converso

    Nome DescrioCHARTOROWID converte uma string para ROWIDCONVERT converte uma string de uma character set

    para outroHEXTORAW converte de hexadecimal para o formato

    RAWRAWTOHEX converte de raw para hexadecimalROWIDTOCHAR converte de ROWID para uma stringTO_CHAR converte um nmero ou data para stringTO_DATE converte uma string para dataTO_NUMBER converte uma string para nmero

  • Fun o TO_CHAR

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

    VARCHAR2]] )RETURN VARCHAR2

    TO_CHAR(SYSDATE, TO_CHAR(SYSDATE, MonthMonth DD, YYYY)DD, YYYY)= >= > MarchMarch 10,199710,1997TO_CHAR(564.70, $999.9 ) = > $564.7TO_CHAR(564.70, $999.9 ) = > $564.7TO_CHAR(564.70, $0000999.9 ) = > $0000564.7TO_CHAR(564.70, $0000999.9 ) = > $0000564.7

  • Fun o TO_DATE

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

    RETURN DATETO_DATE( 123198 , MMDDYY) = > 31TO_DATE( 123198 , MMDDYY) = > 31--DECDEC--19981998TO_DATE( 16/7/94 , DD/MM/YY) = > 16TO_DATE( 16/7/94 , DD/MM/YY) = > 16--JULJUL--19941994

  • Fun o TO_NUMBER

    FUNCTION TO_NUMBER(string_in INCHAR|VARCHAR2}

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

    RETURN NUMBERTO_NUMBER( 123.23 ) = > 123.23TO_NUMBER( 123.23 ) = > 123.23TO_NUMBER(TO_NUMBER( abcdefabcdef ) = > ERRO) = > ERRO

  • Fun es 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 nulaMAX retorna o valor mximo da colunaMIN retorna o valor mnimo da colunaSTDDEV retorna o desvio padro da colunaSUM retorna a soma dos valores da colunaVARIANCE retorna a varincia estatstica da coluna

  • Cursores

  • Conc ei t os

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

    Ex.:Ex.:CURSOR empregado_CURSOR empregado_curcur ISIS

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

  • Opera es em Cursores

    OPENabre o cursor, faz o abre o cursor, faz o parseparse e o e o bindbind da da consulta associada, identificando o resultadoconsulta associada, identificando o resultadoo cursor posicionado antes da primeira linha.o cursor posicionado antes da primeira linha.

    FETCHbusca a linha corrente do cursor e o posiciona na busca a linha corrente do cursor e o posiciona na prxima prxima

    CLOSEfecha o cursor e libera a memria alocada.fecha o cursor e libera a memria alocada.

  • 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 pode a varivel referencia um objeto cursor e pode referenciar diferentes comandos SQL em referenciar diferentes comandos SQL em ocasies diferentes.ocasies diferentes.novanova featurefeature do PL/SQL.do PL/SQL.

  • Tipos de Cursores

    Implcitoso PL/SQL utiliza um cursor implcito sempre que o PL/SQL utiliza um cursor implcito sempre que um comandos SQL executado diretamente no um comandos SQL executado diretamente no cdigo, desde que o cdigo no utilize um cursor cdigo, desde que o cdigo no utilize um cursor explcitoexplcitousados em cada UPDATE, INSERT ou DELETEusados em cada UPDATE, INSERT ou DELETEso menos eficientes que cursores explcitosso menos eficientes que cursores explcitosmais suscetveis a erromais suscetveis a erro

  • Tipos de Cursores

    Explcitoscomando SELECT explicitamente definido na comando SELECT explicitamente definido na seo de declarao, sendo um nome seo de declarao, sendo um nome associado a ele associado a ele usados quando desejamos recuperar mais de usados quando desejamos recuperar mais de uma linha de resultadouma linha de resultadono existem para comandos de UPDATE, no existem para comandos de UPDATE, INSERT e DELETEINSERT e DELETE

  • Dec lara o

    CURSOR nome_cursor [ ( [ parmetro [ , parmetro ...] ) ][ RETURN especificao_retorno ]IS comando_SELECT;

  • Var ive is em um Cursor

    Nome do Cursor no uma varivelNo PL/SQL, a lista de itens no SELECT pode conter colunas, variveis do PL/SQL e variveis associadas (p.e. Oracle Forms).

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

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

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

  • Prec ednc ia de um Ident i f ic ador

    Em um cursor, existe precedncia do nome da coluna sobre o nome de uma varivel PL/SQL.

    PROCEDURE melhorar_SQL PROCEDURE melhorar_SQL ISIS

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

    SELECTSELECT salariosalario ++ salariosalarioFROM empregadoFROM empregado

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

  • A c lasula RETURN

    Somente pode ser usada para cursores que esto contidos em um package.A clasula RETURN pode ser feita com as seguintes estruturas:

    UmUm recordrecord definido a partir de uma tabela, definido a partir de uma tabela, usando %ROWTYPEusando %ROWTYPEUmUm recordrecord definido a partir de umdefinido a partir de um recordrecord prpr--definido pelodefinido pelo progamadorprogamador

  • Ex em plo de Uso da c lasula 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 Body

    PACKAGEPACKAGE bodybody empresa ISempresa ISCURSOR empresa_CURSOR empresa_curcur (id IN NUMBER)(id IN NUMBER)

    RETURN empresa%ROWTYPE ISRETURN empresa%ROWTYPE ISSELECT * FROM empresaSELECT * FROM empresaWHERE empresa_id = id;WHERE empresa_id = id;

    END empresa;END empresa;

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

    Uma package uma coleo de objetos logicamente relacionadosAgrupando os cdigos, torna-se mais fcil a identificao e uso dos cdigos pelo programadorCursores em packages so essencialmente caixas pretasO programador no precisa saber como um cursor recuperado

  • Abr indo Cursores

    OPEN < nome_cursor> [ (parmetro [ , parmetro ...] ) ] ;O comando OPEN no recupera linhas.Todos os fetches refletiro os dados exatamente como da ocasio em que o cursor foi aberto.

  • Rec uperando Dados de Cursores

    FETCH < nome_cursor> INTO < registro_ou_lista_variveis>

    Exemplo:FETCH empresa_FETCH empresa_curcur INTO empresa_INTO empresa_regreg;;FETCHFETCH maxmax_sal__sal_curcur INTOINTO maxmax_sal;_sal;FETCHFETCH emprempr__curcur INTOINTO emprempr_nome(1),_nome(1),dtdt__contratcontrat, , :depto.min_:depto.min_salariosalario;;

  • Fec hando Cursores

    CLOSE < nome_cursor>Libera rea de memria (SGA).Libera todo bloqueio (lock) causado pelo cursor.

    Existe um limite mximo de cursores que podem ser abertos no SGBD Oracle.Um cursor automaticamente fechado quando o seu escopo abandonado.

  • At r ibut os de Cursores

    Nome Descrio

    %FOUND retorna TRUE se o registro foirecuperado com sucesso

    %NOTFOUND recupera TRUE se o registro no foirecuperado com sucesso

    %ROWCOUNT retorna o nmero de registrosrecuperados at o momento

    %ISOPEN retorna TRUE se o cursor estiveraberto

  • At r ibut os de Cursores

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

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

  • At r ibut os de Cursores

    %NOTFOUNDOposto ao %FOUNDOposto ao %FOUNDMuito utilizado para terminao deMuito utilizado para terminao de loopsloops

    EXIT WHEN empresa_cur%NOTFOUND;

  • At r ibut os de Cursores

    %ROWCOUNTDECLAREDECLARE

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

    empemp__reg empreg emp__curcur%ROWTYPE;%ROWTYPE;BEGINBEGIN

    OPENOPEN empemp__curcur;;LOOPLOOP

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

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

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

    END;END;

  • At r ibut os de Cursores

    %ISOPENIF NOTIF NOT empemp__curcur%ISOPEN THEN%ISOPEN THEN

    OPENOPEN empemp__curcur;;END IF;END IF;

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

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

    SQL%FOUNDSQL%FOUNDSQL%NOTFOUNDSQL%NOTFOUNDSQL%ROWCOUNTSQL%ROWCOUNTSQL%ISOPENSQL%ISOPEN

  • Parm et ros em Cursores

    Um parmetro faz com que um cursor se torne mais reutilizvel.

    DECLAREDECLARECURSOR empresa_CURSOR empresa_curcur (categoria_in VARCHAR2) (categoria_in VARCHAR2)

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

    Podemos definir um valor padro para um parmetro.

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

  • SELECT ... FOR UPDATE

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

    Ningum conseguir alterar estes registros Ningum conseguir alterar estes registros antes de um ROLLBACK ou COMMITantes de um ROLLBACK ou COMMITCURSORCURSOR empemp__curcur ISIS

    SELECT nome,SELECT nome, salariosalarioFROM empregadoFROM empregadoWHEREWHERE salariosalario < 100< 100FOR UPDATE FOR UPDATE

  • WHERE CURRENT OF

    Esta clusula utilizada para comandos DELETE e UPDATE dentro de um cursor.

    O registro mais recentemente recuperado O registro mais recentemente recuperado apagado ou atualizadoapagado ou atualizadoExemplo:Exemplo:FETCHFETCH empemp__curcur INTOINTO empemp__regreg;;......

    UPDATE empregado SETUPDATE empregado SET salariosalario :=:= salariosalario ++ bonusbonusWHERE CURRENT_OFWHERE CURRENT_OF empemp__curcur;;

  • Var ive is Cursores

    Disponvel a partir das releases 2.2 e 2.3.Possibilidade de passar como parmetro o resultado de consultas para outros programas.Variveis cursores so como ponteiros do C ou Pascal, na qual um endereo de memria assinalado. Declarando uma varivel cursor se cria um ponteiro, no um objeto.

  • Porque usar var ive is c ursor?

    Usa-se uma varivel cursor para passar o resultado de uma query entre stored subprograms e aplicaes client. Por exemplo, uma aplicao Client, Oracle Forms, e Oracle Server podem ambos se referenciar mesma rea de trabalho.

  • Var ive is Cursores

    OPEN cursorOPEN cursor

    FETCH reg1FETCH reg1

    CLOSE cursorCLOSE cursor

    FETCH reg2FETCH reg2

    FETCH reg3FETCH reg3

  • Var ive is Cursores

    ExemploDECLAREDECLARE

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

    empresa_curvar empresa_empresa_curvar empresa_curtipocurtipo;;BEGINBEGIN

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

    ......

  • Def in indo um a Var ive l Cursor

    TYPE ref_type_name IS REF CURSOR RETURN return_type;

    ondeonde refref__typetype__namename o nome da varivel o nome da varivel especificada para uso subsequente eespecificada para uso subsequente e returnreturn__typetypedeve representar umdeve representar um recordrecord ou umaou uma rowrow na tabela.na tabela.Exemplo:Exemplo:DECLAREDECLARE

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

  • Em um a St ored Proc edure

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

    RETURN emp%ROWTYPE;PROCEDURE open_emp_cv

    (emp_cv IN OUT EmpCurTyp, choice IN NUMBER);

    END emp_data;

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

    CREATE PACKAGE BODY emp_data ASPROCEDURE open_emp_cv(emp_cv IN OUT EmpCurTyp,

    choice IN NUMBER) ISBEGIN

    IF choice = 1 THENOPEN emp_cv FOR SELECT * FROM emp

    WHERE comm IS NOT NULL;

    ELSIF choice = 2 THENOPEN emp_cv FOR SELECT * FROM emp

    WHERE sal > 2500;ELSIF choice = 3 THEN

    OPEN emp_cv FOR SELECT * FROM emp WHERE deptno = 20;

    END IF;END open_emp_cv;END emp_data;

  • Loop Sim ples para Cursores

    As instrues devem ser feitas explicitamente:

    Abrir o cursorAbrir o cursorColocar o Colocar o fetch fetch dentro do dentro do looploopEstabelecer a condio para fim do Estabelecer a condio para fim do looploopFechar o cursorFechar o cursor

    Requer maior ateno do desenvolvedorMaior possibilidade de ocorrer erro

  • Loop Sim ples para Cursores

    ExemploDECLARE

    CURSOR cur_emp IS ...BEGIN

    OPEN cur_emp;LOOP

    FETCH cur_emp INTO ...EXIT WHEN cur_emp%NOTFOUND;-- processar informaes do cursor

    END LOOP;CLOSE cur_emp;

    END;

  • Loop FOR para Cursores

    FOR indice_registro IN nome_cursorLOOP

    < comandos>END LOOP;

    OO looploop termina incondicionalmente quando termina incondicionalmente quando todos os registros do cursor forem todos os registros do cursor forem recuperadosrecuperadosA cada execuo doA cada execuo do looploop, o PL/SQL verifica o , o PL/SQL verifica o atributo %NOTFOUNDatributo %NOTFOUND

  • Loop FOR para Cursores

    ExemploDECLAREDECLARE

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

    BEGINBEGINFORFOR ocupacaoocupacao__regreg ININ ocupacaoocupacao__curcurLOOPLOOP

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

    END LOOP;END LOOP;END;END;

  • Loop FOR para Cursores

    Quando usar:quando desejamos recuperar e processar quando desejamos recuperar e processar todos os registros do cursortodos os registros do cursorno apropriado situaes em que no apropriado situaes em que condies devem ser avaliadas para condies devem ser avaliadas para determinar o trmino da operao de determinar o trmino da operao de recuperaorecuperao

    Observaoo ndice doo ndice do looploop, neste caso uma varivel do , neste caso uma varivel do tipo registro, encarado da mesma forma tipo registro, encarado da mesma forma que ndices numricosque ndices numricos

  • Ex erc c io I I .1

    Liste os 3 departamentos com maior folha (soma dos salrios dos empregados), em ordem decrescente.Sugesto:

    Utilize as tabelas Utilize as tabelas dept dept e e emp emp (SCOTT/TIGER)(SCOTT/TIGER)utilize o procedimento utilize o procedimento DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.PUT_LINE

  • Ex erc c io I I .2

    De acordo com o salrio de um empregado, calcule o imposto de renda correspondente.Sugestes

    Utilize a tabelaUtilize a tabela empemp SCOTT/TIGERSCOTT/TIGERNo considere possveis deduesNo considere possveis dedues

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

  • Ex erc c io I I .3

    Calcular o total de salrios pagos (salrio + comisso) para empregados de um departamento. Determinar tambm quantos empregados tem salrio maior que $2000 e quantos tem a comisso maior que o salrio.

  • Subprogram as:Proc edim ent os e Fun es

  • Conc ei t os

    Modularizaoprocesso de quebrar grandes blocos de processo de quebrar grandes blocos de cdigo em pequenos pedaos (mdulos)cdigo em pequenos pedaos (mdulos)torna o cdigo:torna o cdigo:

    mais reutilizvelmais fcil de gerenciarmais legvelmais confivel

  • Conc ei t os

    Estruturas para Modularizao (PL/SQL):

    procedimentoprocedimentobloco que efetua uma ou mais aes, sendo

    possvel a passagem de informaes, tanto para dentro quanto para fora do procedimento

    funofunoretorna um nico valor; podemos passar

    informaes para a funo atravs de parmetros

  • Conc ei t os

    bloco annimobloco annimobloco PL/SQL que efetua uma ou mais tarefas;

    usado para controlar o escopo dos identificadores e manuseio de exceptions

    packagepackagecoleo de procedimentos, funes, tipos e

    variveis; no exatamente um mdulo, mas est relacionado ao assunto

  • Est rut ura do Bloc o PL/SQL (Reviso)

    CabealhoCabealhoIS

    Seo de DeclaraoSeo de Declarao

    BEGIN

    Seo de ExecuoSeo de Execuo

    EXCEPTION

    Seo de ExceptionsSeo de Exceptions

    END;

    DECLARE

    Seo de DeclaraoSeo de Declarao

    BEGIN

    Seo de ExecuoSeo de Execuo

    EXCEPTION

    Seo de ExceptionsSeo de Exceptions

    END;

  • Est rut ura de Bloc os PL/SQL

    PROCEDURE contratar(nome_in IN VARCHAR2)IS

    data_contratacao DATE;BEGIN

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

    VALUES (nome_in, data_contratacao);

    WHEN DUP_VAL_IN_INDEXTHEN

    DBMS_OUTPUT.PUT_LINE( No inseriu );

    EXCEPTION

    END;

  • Esc opo (Reviso)

    DECLAREdata_contratacao DATE;

    BEGIN

    END;

    DECLAREdata_contratacao DATE;

    BEGIN

    END;

    DECLAREtotal_vendas NUMBER;

    BEGIN

    END;

    DECLAREtotal_vendas NUMBER;

    BEGIN

    END;

    escopo de total_vendas

    escopo de total_vendas

    escopo de data_contratacao

    escopo de data_contratacao

  • Proc edim ent os

    EstruturaPROCEDURE < nome> [ (parmetro [ , PROCEDURE < nome> [ (parmetro [ , parmetro ...] ) ]parmetro ...] ) ]ISIS

    [comandos de declarao][comandos de declarao]BEGINBEGIN

    < comandos>< comandos>[ EXCEPTION[ EXCEPTION

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

  • Proc edim ent os

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

    aplicar_desconto(nova_empr_id, 15.00);

  • Proc edim ent os

    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 IN NUMBER)

    Corpocdigo necessrio para a execuo do cdigo necessrio para a execuo do procedimentoprocedimento

    PROCEDURE nada ISBEGIN

    NULL;END;

  • Ex em plo de Proc edure

    PROCEDURE raise_salary (emp_id INTEGER, increase REAL) IS

    current_salary REAL;salary_missing EXCEPTION;

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

    RAISE salary_missing;ELSE

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

    END IF;EXCEPTION

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

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

    END raise_salary;

  • Fun es

    EstruturaFUNCTION nome [ (parmetro [ , parmetro FUNCTION nome [ (parmetro [ , parmetro ...] ) ] ...] ) ]

    RETURN tipo_retornadoRETURN tipo_retornadoISIS

    [comandos de declarao][comandos de declarao]BEGINBEGIN

    comandoscomandos[ EXCEPTION[ EXCEPTION

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

  • Fun es

    Chamadauma funo chamada como parte de um uma funo chamada como parte de um comando, sempre que uma expresso pode comando, sempre que uma expresso pode ser usadaser usada

    vendas_95 := total_vendas( Marisol , 1995);DECLARE

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

    THEN ...

  • Fun es

    Cabealhonome da funo, lista de parmetros enome da funo, lista de parmetros etipo do retornotipo do retorno

    FUNCTION total_vendas(nome_in IN empresa.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;

  • Dec lara o RETURN

    Encerra a execuo da funo e retorna o valor para o programa que a chamou.Um subprograma pode conter vrias declaraes RETURN.Em procedures a declarao RETURN no deve conter uma expresso.Em funes a declarao RETURN deve conter uma expresso que executada no momento da execuo da declarao.

  • Ex em plo de Fun o

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

    min_sal REAL;max_sal REAL;

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

  • Parm et ros

    Modo de troca de informaes entre o mdulo e o bloco PL/SQL que o chamou.Quando declaramos um parmetro, nunca especificamos restries quanto ao tamanho do tipo de dado.

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

    permitida a utilizao de %TYPE e %ROWTYPE na declarao de parmetros

  • Modo de Passagem de Parm et ros

    INsomente para leiturasomente para leitura

    OUTsomente para escrita (o mdulo pode atribuir somente para escrita (o mdulo pode atribuir um valor ao parmetro, que ser passado ao um valor ao parmetro, que ser passado ao bloco PL/SQL que o chamou)bloco PL/SQL que o chamou)

    IN OUTusado para leitura e escritausado para leitura e escrita

  • Passagem de Parm et ros

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

    formato IN VARCHAR2 := ULTIMO PRIMEIRO )-- O parmetro formato no precisa obrigatoriamente ser informado

    ISBEGIN

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

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

    END IF;END;

  • Com o o PL/SQL faz a assoc ia o dos parm et ros?

    Notao Posicionalassocia o valor ao parmetro correspondente associa o valor ao parmetro correspondente implicitamente atravs da posioimplicitamente atravs da posio

    Notao por Nome Explicitamenteassocia um valor a um parmetro associa um valor a um parmetro explicitamente 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 );

  • St ored Proc edures/Func t ions

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

    tem um nometem um nomepode receber e retornar valorespode receber e retornar valoresfica armazenada no dicionrio de dadosfica armazenada no dicionrio de dadospode ser usada por vrios usuriospode ser usada por vrios usurios

  • St ored Proc edures/Func t ions

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

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

    INTO emp_retFROM empWHERE empno = emp_numero;

    END;

    Exemplo:

  • Mdulo Loc al

    Procedimento ou funo definido da seo de declarao de um bloco PL/SQL.No pode ser chamado por nenhum outro mdulo PL/SQL definido fora do bloco ao qual o mesmo pertence.Vantagens

    reduz o tamanho do mdulo, eliminando reduz o tamanho do mdulo, eliminando cdigos repetitivoscdigos repetitivostorna o cdigo mais legveltorna o cdigo mais legvel

  • Ex em plo de Mdulos Loc ais

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

    rent := rent + increase;...

    END raise_rent;...

    BEGIN...

    raise_rent(rent); indeterminate

  • Dependnc ias dos Subprogram as

    Subprogramas so dependentes dos objetos que referenciamCaso algum destes objetos forem alterados por uma operao DDL, o subprograma fica com status INVALID e deve ser recompiladoALTER {PROCEDURE | FUNCTION} nome COMPILE;Determinao de dependncia (no INIT.ORA)

    TimestampTimestampAssinaturaAssinatura

  • Pr iv i lg ios de Ac esso

    Para poder executar um subprograma necessrio ter o privilgio EXECUTE para o objeto.Um subprograma executado utilizando os privilgios explcitos do seu owner, sem considerar privilgios de roles.

  • Pac k ages

  • Conc ei t os

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

    cursorescursores

    variveisvariveisnomes denomes de exceptionsexceptionscomandos TYPEcomandos TYPEprocedimentos e funesprocedimentos e funes

  • Conc ei t os

    Vantagens de utilizarmos packages:information hidinginformation hidingprojeto orientado a objetosprojeto orientado a objetosprojetoprojeto toptop--downdownpersistncia de objetospersistncia de objetosmelhor performancemelhor performance

  • In t er fac e

    AplicaoBody

    EspecificaoDataBase

    Package

  • Est rut ura de um a Pac k age

    Especificaocontm as definies e especificaes de contm as definies e especificaes de todos os elementos em uma todos os elementos em uma packagepackage que que podem ser referenciados fora dela.podem ser referenciados fora dela.

    PACKAGE nome_package IS[ declaraes de variveis e tipos ][ declaraes de cursores ][ declaraes de mdulos ]END [nome_package] ;

  • Est rut ura de um a Pac k age

    Corpocontm implementao de mdulos, cursores contm implementao de mdulos, cursores e 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 em plo Pac k age - Espec i f ic a o

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

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

    PROCEDURE fire_employee (emp_id NUMBER);END emp_actions;

  • Ex em plo Pac k age - Body

    CREATE PACKAGE BODY emp_actions AS CURSOR desc_salary RETURN EmpRecTyp IS

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

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

    ISBEGIN

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

    END hire_employee;PROCEDURE fire_employee (emp_id NUMBER) IS

    BEGINDELETE FROM emp WHERE empno = emp_id;

    END fire_employee;END emp_actions;

  • Pac k ages e Esc opo

    Objetos declarados na Package Specification tm escopo pblico, podendo ser utilizados fora da packagenome_da_package.nome_do_subprograma (...)nome_da_package.nome_do_tipoAqueles objetos definidos somente no Package Body tm escopo privado, podendo somente ser utilizados por outros objetos dentro da package

  • FUNCTION valor_ok(numero_in IN NUMBER) RETURN BOOLEAN

    ISBEGIN

    RETURN numero_in > 0;END;

    FUNCTION valor_ok(data_in IN DATE) RETURN BOOLEAN

    ISBEGIN

    RETURN date_in

  • Over loading de Mdulos

    Onde Fazer?na seo de declarao de um bloco PL/SQLna seo de declarao de um bloco PL/SQLdentro de umdentro de um packagepackage

    No podemos fazer a sobrecarga de nomes de programas independentes, muito menos criar dois mdulos independentes com o mesmo nome e listas de parmetros distintas.

  • Ex em plo

    DECLARETYPE DateTabTyp IS TABLE OF DATE

    INDEX BY BINARY_INTEGER;TYPE RealTabTyp IS TABLE OF REAL

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

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

    END;

  • In ic ia l iza o de Pac k ages

    Uma package pode conter um conjunto de instrues a serem executadas somente quando a mesma carregada para a memria

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

    BEGINBEGIN---- Cdigo de inicializaoCdigo de inicializao......

    END nome_END nome_packpack;;

  • Dependnc ias de Pac k ages

    O Package Body depende da Package Specification e dos objetos referenciadosA Package Specification no depende de nadaVises para dependncias no PL/SQL 8.0:

    useruser__dependenciesdependenciesallall__dependenciesdependenciesdbadba__dependenciesdependencies

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

    Uma funo independente ou contida numa package pode ser chamada numa instruo SQL, dependendo das restries de refernciaRestries de Referncia: definem quais tipos de estruturas de dados que a funo l ou modifica

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

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

    Somente para Stored 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

    Para funes independentes o PL/SQL consegue determinar as restries de referncia.Para funes em packages necessrio discriminar as restries atravs da pragma abaixo. Isto porque os blocos PL/SQL que chamam uma funo empacotada dependem apenas da package specification e no do body.

    PRAGMA RESTRICT_REFERENCES (nome_funo, WNDS PRAGMA RESTRICT_REFERENCES (nome_funo, WNDS [,WNPS] [,RNDS] [,RNPS]);[,WNPS] [,RNDS] [,RNPS]);

  • Algum as Pac k ages Pr-Def in idas

    Nome DescrioDBMS_DDL execuo de comandos DDL

    DBMS_JOB submete e gerencia jobs programadosdentro do database

    DBMS_OUTPUT mostra sadas de programas PL/SQLno terminal

    DBMS_SNAPSHOT gerenciamento de snapshots

    DBMS_SQL construo de SQLs dinmicosUTL_FILE permite que programas PL/SQL leiam

    e escrevam em arquivos

  • Ex erc c io I I I .1

    Converta o script criado no exerccio I .2 (razes de uma equao do 2o grau) para um procedimento.Armazene este procedimento no banco.

  • Ex erc c io I I I .2

    Converta o script do exerccio I I .1 (trs departamentos com maior folha - soma de salrios) para um procedimento.Ao invs de mostrar as informaes na tela, insira-as em uma tabela.Armazene este procedimento no banco (stored procedure).

  • Ex erc c io I I I .3

    Converta o script do exerccio I I .2 (clculo do imposto renda) para uma funo, que receba como parmetro a matrcula do funcionrio e retorne o imposto a ser pago.Armazene esta funo no banco (stored function).

  • Ex erc c io I I I .4

    Construa uma package contendo as funes / procedimentos do departamento pessoal.Armazene esta package no banco de dadosOracle.Salrio Lquido = SAL+ COMM - Imposto de RendaCOMM = Se o JOB= CLERK, comisso = 1.03 * SALGravar em Contra-Cheque (salrio normal, comisso, imposto de renda e salrio Lquido)

  • Tr iggers

  • Tr iggers

    Correspondem a stored procedures, com a diferena que os triggers so disparados automaticamente quando houver operaes de insert, update e delete nas tabelas associadas.

  • Tr iggers

    As aplicaes de triggers incluem:clculo automtico de colunasclculo automtico de colunascrtica de transaescrtica de transaesgarantia de regras de segurana complexasgarantia de regras de segurana complexasgarantia de integridade referencial em bancos garantia de integridade referencial em bancos de dados distribudosde dados distribudosimplementao de regras de negcio implementao de regras de negcio complexascomplexas

  • Sint ax e

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

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

    pl_sql_block

  • Tr igger ing St a t em ent

    a especificao da ao que levar ao acionamento do trigger, podendo ser:

    INSERTINSERTUPDATEUPDATEDELETEDELETE

  • Tr igger Rest r ic t ion

    uma expresso que limita a execuo de um trigger.Deve resultar em valor TRUE ou FALSE.O trigger somente ser executado para valores TRUE.

  • Tr igger Ac t ion

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

  • Tipos de Tr iggers

    ROW TRIGGERSso executados uma vez para cada linha so executados uma vez para cada linha da tabela afetada pelo comando SQL.da tabela afetada pelo comando SQL.

    STATEMENT TRIGGERSso executados apenas uma vez para cada so executados apenas uma vez para cada comando SQL que afete a tabelas, comando SQL que afete a tabelas, independentemente do nmero de linhas independentemente do nmero de linhas envolvidas.envolvidas.

  • Ac ionam ent o de Tr iggers

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

    before rowbefore rowbefore statementbefore statementafter rowafter rowafter statementafter statement

  • Tr iggers (Ex em plo)

    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;

  • Lim i t e de Tr iggers por Tabela

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

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

  • Tr iggers ins t ead-of

    Em PL/SQL 8.0, podem ser definidos triggers que sero disparados em vez da instruo DML que os disparouSomente para visesA nvel de linhaExemplo:

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

  • Pseudo-reg is t ros

    Disponvel para triggers a nvel de linha:old

    valores originais do registro da tabelavalores originais do registro da tabelasomente para leitura no corpo do somente para leitura no corpo do triggertrigger

    :newvalores do registro que sero inseridos ou valores do registro que sero inseridos ou atualizados na base de dadosatualizados na base de dadospodem ser atribudos valores (somente podem ser atribudos valores (somente quando quando beforebefore))

  • Clusula WHEN

    Vlida para triggers a nvel de linhaO corpo do trigger ser executado para as linhas que a condio especificada resultar em TRUEOs pseudo-registros :old e :new podem ser utilizados dentro da condio, mas os dois pontos devem ser suprimidos

  • Predic ados de Tr igger

    Usados em triggers disparados para diferentes tipos de instrues de DMLFunes booleanas que identificam a instruo que disparou o trigger

    INSERTINGINSERTINGUPDATINGUPDATINGDELETINGDELETING

  • Trat am ent o de Erros

  • Conc ei t os

    Uma exception uma situao que no deveria ter ocorrido.Pode ser causada por:

    erro gerado pelo sistema (p.e. out oferro gerado pelo sistema (p.e. out ofmemorymemory ))erro causado por uma ao do usurioerro causado por uma ao do usurioaviso gerado pela aplicao e direcionado ao aviso gerado pela aplicao e direcionado ao usuriousurio

  • Ex c ept ion Handlers

    Este mecanismo permite separar o cdigo de processamento de erros do resto dos comandos.Oferece um modelo orientado a eventos.No importa como uma exception foi gerada, ela ser tratada na mesma seo (exception section).

  • Desvio do Flux o

    PROCEDURE fluxoIS

    novo_valor VARCHAR2(5);BEGIN

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

    ...

    END IF;

    EXCEPTIONWHEN VALUE_ERRORTHEN ...

    END;

  • Tipos de Ex c ept ions

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

    geradas devido a um erro no processamento do SGBD ou do cdigo PL/SQL

    definidas pelo programador com um nomedefinidas pelo programador com um nomegeradas devido a um erro no cdigo; elas so

    declaradas na seo correspondente

  • Tipos de Ex c ept ions

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

    SGBD ou do cdigo PL/SQL; somente as mais comuns possuem um nome

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

    executadoo programador informa um nmero (-20000 a

    20999) e uma mensagem de erro; utilizada para facilitar a comunicao de erros do

    ambiente cliente-servidor.

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

    DECLAREstmt INTEGER := 1; designates 1st SELECT statement

    BEGINSELECT ...stmt := 2; designates 2nd SELECT statementSELECT ...stmt := 3; designates 3rd SELECT statementSELECT ......

    EXCEPTIONWHEN NO_DATA_FOUND THEN

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

    END;

  • Ex c ept ions Pr-Def in idas

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

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

    Diferente das exceptions pr-definidas, asexceptions definidas pelo programador devem ser declaradas e devem ser chamadas explicitamente atravs da declarao:

    RAISERAISEDefinindo a Exception:DECLAREDECLARE

    past_due EXCEPTION;acct_num NUMBER(5);

  • Ex em plo

    DECLAREpast_due EXCEPTION;acct_num NUMBER;

    BEGIN...

    DECLARE incio do sub blockpast_due EXCEPTION;acct_num NUMBER;BEGIN

    ...

    IF ... THENRAISE past_due; esta exception no

    executadaEND IF;...

    END; fim do sub-blockEXCEPTION

    WHEN past_due THEN no usada...

    END;

  • EXCEPTION_INIT pragm a

    Pragma uma instruo especial ao compiladorA EXCEPTION_INIT pragma indica que o compilador deve associar um nome a umaexception que possui um nmero correspondente.

  • EXCEPTION_INIT pragm a

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

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

    BEGINDELETE FROM empresa;

    EXCEPTIONWHEN ainda_ha_empreg THEN

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

    END;

  • Usando ra ise_appl ic at ion_error

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

    continua...

  • Usando ra ise_appl ic at ion_error

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

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

  • Usando ra ise_appl ic at ion_error

    CREATE PROCEDURE raise_salary (emp_id NUMBER, increase NUMBER) AScurrent_salary NUMBER;BEGIN

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

    /* Issue user defined error message. */raise_application_error( 20101, Salary is missing );

    ELSEUPDATE emp SET sal = current_salary + increaseWHERE empno = emp_id;

    END IF;END raise_salary;

  • Se o Ex c ept ion

    EXCEPTIONWHEN exception_name1 THEN handler

    sequence_of_statements1WHEN exception_name2 THEN another handler

    sequence_of_statements2...

    WHEN OTHERS THEN optional handlersequence_of_statements3

    END;

  • Usando SQLCODE e SQLERRM

    No tratamento de uma exception pode-se usar as funes SQLCODE e SQLERRMPara exceptions internas, o nmero do SQLCODE negativo a menos que o erro seja no_data_found que neste caso + 100.O SQLERRM retorna a mensagem doOracle.

  • Ex em plo

    DECLAREerr_num NUMBER;err_msg VARCHAR2(100);

    BEGIN...

    EXCEPTION...

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

    END;

  • Ex erc c io IV.1

    Altere o script do exerccio I .1, incluindo a seo de exception (prevendo o caso em que o nmero informado for menor que zero).

  • Ex erc c io IV.2

    Construa um script que faa uma consulta simples base de dados (tabela scott.emp) tomando como parmetro o nome do funcionrio e retorne a sua matrcula.

    Utilize o comando SELECT INTOUtilize o comando SELECT INTOPense na possibilidade do funcionrio no ser encontradoPense na possibilidade do funcionrio no ser encontradoPense na possibilidade de existirem dois funcionrios com Pense na possibilidade de existirem dois funcionrios com o mesmo nomeo mesmo nome

    Trate as demaisTrate as demais exceptionsexceptions de uma maneira genricade uma maneira genrica

  • Ex erc c io IV.3

    Converta o script anterior (IV.2 - retorno da matrcula do funcionrio dado um nome) para uma procedimento (recebe o nome, retorna a matrcula e um status indicando se fez a recuperao com sucesso, se no encontrou ou se existem registros duplicados).Armazene este procedimento no banco (stored procedure).

  • Test es e Depura o

  • Diret r izes de Depura o

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

  • DBMS_OUTPUT

    Pacote para mostrar mensagensProcedure Descrio

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

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

  • Ex em plo de DBMS_OUTPUT

    BEGINDBMS_OUTPUT.ENABLE(20000);DBMS_OUTPUT.PUT_LINE( Incio );...

    DBMS_OUTPUT.PUT_LINE( Fim );END;

  • Proc edure Bui lder

    Ambiente de desenvolvimento de PL/SQLServe como depurador de cdigo PL/SQLNo pode depurar stored procedures, somente chamar

  • PL/SQL In t erpret er

    VisualizadorMostra o bloco, procedimento ou funo que Mostra o bloco, procedimento ou funo que est sendo executadoest sendo executado

    Linha de comandosPermite execuo imediata de instrues de Permite execuo imediata de instrues de PL/SQLPL/SQL

  • Fac i l idades

    Depurar sem necessidade de alterar o cdigo

    Insero de Insero de breakpointsbreakpointsVisualizao e alterao dos valores das Visualizao e alterao dos valores das variveis locaisvariveis locais

    Depurao mais simplesAmbiente de desenvolvimento integrado

  • PL/SQL Dinm ic o

  • DBMS_SQL

    A instruo SQL pode ser montada dinamicamente dentro do blocoProcessa trs tipos de instrues

    instrues de DML e DDLinstrues de DML e DDLconsultasconsultasblocos de PL/SQL annimosblocos de PL/SQL annimos

    Instrues SELECT no devem possuir a clusula INTONo incluir ponto e vrgula no final, exceto blocos PL/SQL annimos

  • DBMS_SQL.OPEN_CURSOR

    Abre o cursor para executar a instruo SQL atribuindo um ID para o cursor que ser utilizado nas chamadas subsequentes.Sintaxe:FUNCTION OPEN_CURSOR RETURN INTEGER;

  • DBMS_SQL.PARSE

    Anlise da instruoVerificao da sintaxe e semntica da Verificao da sintaxe e semntica da instruoinstruoSe for uma consulta, determina o plano de Se for uma consulta, determina o plano de execuoexecuo

    SintaxePROCEDURE PARSE (cursor_id IN INTEGER,

    instruo IN VARCHAR2,indicador_linguagem IN

    INTEGER);onde onde indicador_linguagemindicador_linguagem pode serpode ser V6, V7 ou V6, V7 ou NATIVE.NATIVE.

  • DBMS_SQL.BIND_VARIABLE

    Associao de variveis de entrada de dados variveis reais do bloco PL/SQLSintaxePROCEDURE BIND_VARIABLEPROCEDURE BIND_VARIABLE

    (cursor_id IN INTEGER,(cursor_id IN INTEGER,:nome_na_instruo IN :nome_na_instruo IN

    VARCHAR2,VARCHAR2,valor_para_atribuir IN valor_para_atribuir IN tipo_dadotipo_dado););

    onde tipo_dado pode ser NUMBER, onde tipo_dado pode ser NUMBER, VARCHAR2 ou DATE.VARCHAR2 ou DATE.

    H variaes para os demais tipos de dado

  • DBMS_SQL.DEFINE_COLUMN

    Associao de variveis de sada de dados (resultado de uma consulta) variveis reais do bloco PL/SQLSintaxePROCEDURE DEFINE_COLUMN

    (cursor_id IN INTEGER,posio_coluna IN INTEGER,nome_coluna IN tipo_dado);

    Uma instruo para cada coluna da consulta

  • DBMS_SQL.EXECUTE

    Para no consultaexecuta a instruo e retorna o nmero de executa a instruo e retorna o nmero de linhas processadaslinhas processadas

    Para consultadetermina o conjunto de linhas a serem determina o conjunto de linhas a serem processadasprocessadas

    SintaxeFUNCTION EXECUTE (cursor_id IN INTEGER)

    RETURN INTEGER;O retorno corresponde s linhas processadas O retorno corresponde s linhas processadas somente se forem instrues INSERT, somente se forem instrues INSERT, UPDATE ou DELETE.UPDATE ou DELETE.

  • DBMS_SQL.FETCH_ROWS

    Somente usado em consultasFaz o fetch buscando os dados no servidorOs dados de retorno so convertidos nos tipos definidos com DEFINE_COLUMNSintaxeFUNCTION FETCH_ROWS (cursor_id IN INTEGER)

    RETURN INTEGER;O retorno o nmero de linhas.O retorno o nmero de linhas.

  • DBMS_SQL.EXECUTE_AND_FETCH

    Combina as operaes de EXECUTE e a primeira chamada de FETCH_ROWSSintaxeFUNCTION EXECUTE_AND_FETCH

    (cursor_id IN INTEGER,busca_exata IN BOOLEAN DEFAULT FALSE)RETURN INTEGER;

    Se Se busca_exatabusca_exata for TRUE e a consulta retornar for TRUE e a consulta retornar mais de uma linha, abre a mais de uma linha, abre a exception exception TOO_MANY_ROWS.TOO_MANY_ROWS.O retorno o nmero de linhas.O retorno o nmero de linhas.

  • DBMS_SQL.VARIABLE_VALUE

    Determina o valor de uma varivel de associao, se for modificada pela instruo (parmetros de sada)Utilizado quando a instruo um bloco PL/SQLSintaxePROCEDURE VARIABLE_VALUE

    (cursor_id IN NUMBER,:nome_na_instruo IN VARCHAR2,valor_variavel OUT tipo_dado);

  • DBMS_SQL.COLUMN_VALUE

    Somente usado em consultas, aps FETCH_ROWSDevolve realmente os dadosVariveis devem ser do mesmo tipo definido em DEFINE_COLUMNSintaxePROCEDURE COLUMN_VALUE

    (cursor_id IN INTEGER,posio_coluna IN INTEGER,valor_coluna OUT tipo_dado);

  • DBMS_SQL.CLOSE_CURSOR

    Fecha o cursorLibera os recursos utilizados pelo cursorSintaxePROCEDURE CLOSE_CURSOR

    (cursor_id IN OUT INTEGER)

  • Ex ec ut ar ins t ru es DML (ex c et o c onsul t as)

    Passos necessrios:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)Analisar a instruo (PARSE)Analisar a instruo (PARSE)Associar quaisquer variveis de entrada de Associar quaisquer variveis de entrada de dados (BIND_VARIABLE)dados (BIND_VARIABLE)Executar a instruo (EXECUTE)Executar a instruo (EXECUTE)Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

  • Ex ec ut ar ins t ru es DDL

    Passos necessrios:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)Analisar a instruo (PARSE)Analisar a instruo (PARSE)Fechar o cursor (CLOSE_CURSOR)Fechar o cursor (CLOSE_CURSOR)

    No pode utilizar bind variables em DDLAs instrues so executadas j no PARSE, no necessitando, assim, de EXECUTE

  • Ex ec ut ar c onsul t as

    Passos necessrios:Abrir o cursor (OPEN_CURSOR)Abrir o cursor (OPEN_CURSOR)Analisar a instruo (PARSE)Analisar a instruo (PARSE)Associar quaisquer variveis de entrada de dados Assoc