48665348-pl-sql

50
__________________________________________________________________________________________ ÍNDICE ASSUNTO: PAG 1. CONCEITO.................................................................................................................................... 81 2. ESTRUTURA................................................................................................................................. 81 3. ARQUITETURA............................................................................................................................ 82 4. COMPONENTES DA LINGUAGEM.......................................................................................... 82 IDENTIFICADORES................................................................................................................82 PALAVRAS RESERVADAS...................................................................................................82 LITERAIS................................................................................................................................82 COMENTÁRIOS:.....................................................................................................................83 5. DECLARAÇÕES........................................................................................................................... 83 TIPOS DE VARIAVEIS............................................................................................................83 VARIÁVEIS SIMPLES................................................................................................83 ATRIBUTOS ESPECIAIS...........................................................................................84 PROBLEMA PROPOSTO...........................................................................................85 RESOLUÇÃO 1:...........................................................................................................85 RESOLUÇÃO 2............................................................................................................86 VARIÁVEIS COMPOSTAS.........................................................................................86 PROBLEMA PROPOSTO...........................................................................................88 RESOLUÇÃO:..............................................................................................................88 CONSTANTES...........................................................................................................88 CONVERSÃO DE TIPO DE VARIÁVEL.................................................................................89 EXEMPLOS DE DECLARAÇÕES..........................................................................................89 VARIÁVEIS ESPECIAIS.............................................................................................89 ATRIBUTOS PARA CURSOR....................................................................................90 PROBLEMA PROPOSTO ..........................................................................................91 RESOLUÇÃO:..............................................................................................................91 6. ATRIBUIÇÕES.............................................................................................................................. 92 7. FUNÇÕES PRÉ-DEFINIDAS....................................................................................................... 92 CONTROLE DE ERROS.........................................................................................................92 SQLCODE..................................................................................................................92 SQLERRM..................................................................................................................92 NUMÉRICAS...........................................................................................................................93 ABS............................................................................................................................93 CEIL............................................................................................................................93 COS............................................................................................................................93 COSH.........................................................................................................................93 EXP............................................................................................................................93 FLOOR.......................................................................................................................93 LN...............................................................................................................................93 LOG............................................................................................................................94 MOD...........................................................................................................................94 POWER......................................................................................................................94 ROUND.......................................................................................................................94 SIGN...........................................................................................................................94 SIN..............................................................................................................................94 SINH...........................................................................................................................94 SQRT..........................................................................................................................94 TAN............................................................................................................................95 TANH..........................................................................................................................95 TRUNC.......................................................................................................................95 CARACTERES........................................................................................................................95 ASCII..........................................................................................................................95 CHR............................................................................................................................95 CONCAT.....................................................................................................................95 INITCAP......................................................................................................................95 __________________________________________________________________________________________

Upload: pablo-verly

Post on 27-Sep-2015

7 views

Category:

Documents


2 download

DESCRIPTION

48665348-PL-SQL

TRANSCRIPT

  • __________________________________________________________________________________________

    NDICE

    ASSUNTO: PAG

    1. CONCEITO....................................................................................................................................812. ESTRUTURA.................................................................................................................................813. ARQUITETURA............................................................................................................................824. COMPONENTES DA LINGUAGEM..........................................................................................82

    IDENTIFICADORES................................................................................................................82PALAVRAS RESERVADAS...................................................................................................82LITERAIS................................................................................................................................82COMENTRIOS:.....................................................................................................................83

    5. DECLARAES...........................................................................................................................83TIPOS DE VARIAVEIS............................................................................................................83

    VARIVEIS SIMPLES................................................................................................83ATRIBUTOS ESPECIAIS...........................................................................................84PROBLEMA PROPOSTO...........................................................................................85

    RESOLUO 1:...........................................................................................................85RESOLUO 2............................................................................................................86

    VARIVEIS COMPOSTAS.........................................................................................86PROBLEMA PROPOSTO...........................................................................................88

    RESOLUO:..............................................................................................................88CONSTANTES...........................................................................................................88

    CONVERSO DE TIPO DE VARIVEL.................................................................................89EXEMPLOS DE DECLARAES..........................................................................................89

    VARIVEIS ESPECIAIS.............................................................................................89ATRIBUTOS PARA CURSOR....................................................................................90PROBLEMA PROPOSTO ..........................................................................................91

    RESOLUO:..............................................................................................................916. ATRIBUIES..............................................................................................................................927. FUNES PR-DEFINIDAS.......................................................................................................92

    CONTROLE DE ERROS.........................................................................................................92SQLCODE..................................................................................................................92SQLERRM..................................................................................................................92

    NUMRICAS...........................................................................................................................93ABS............................................................................................................................93CEIL............................................................................................................................93COS............................................................................................................................93COSH.........................................................................................................................93EXP............................................................................................................................93FLOOR.......................................................................................................................93LN...............................................................................................................................93LOG............................................................................................................................94MOD...........................................................................................................................94POWER......................................................................................................................94ROUND.......................................................................................................................94SIGN...........................................................................................................................94SIN..............................................................................................................................94SINH...........................................................................................................................94SQRT..........................................................................................................................94TAN............................................................................................................................95TANH..........................................................................................................................95TRUNC.......................................................................................................................95

    CARACTERES........................................................................................................................95ASCII..........................................................................................................................95CHR............................................................................................................................95CONCAT.....................................................................................................................95INITCAP......................................................................................................................95

    __________________________________________________________________________________________

  • __________________________________________________________________________________________

    INSTR.........................................................................................................................95LENGTH.....................................................................................................................96LOWER.......................................................................................................................96LPAD..........................................................................................................................96LTRIM.........................................................................................................................96REPLACE...................................................................................................................96RPAD..........................................................................................................................96RTRIM........................................................................................................................96SOUNDEX..................................................................................................................97SUBSTR.....................................................................................................................97TRANSLATE...............................................................................................................97UPPER.......................................................................................................................97

    DATAS....................................................................................................................................97ADD_MONTHS...........................................................................................................97LAST_DAY.................................................................................................................97MONTHS_BETWEEN.................................................................................................97NEW_TIME.................................................................................................................98NEXT_DAY.................................................................................................................98SYSDATE...................................................................................................................98ROUND.......................................................................................................................98TRUNC.......................................................................................................................98

    CONVERSO.........................................................................................................................99CHARTOROWID........................................................................................................99HEXTORAW...............................................................................................................99RAWTOHEX...............................................................................................................99ROWIDTOCHAR........................................................................................................99TO_CHAR...................................................................................................................99

    MISCELNEA.......................................................................................................................100DECLARE.................................................................................................................100GREATEST..............................................................................................................101LEAST......................................................................................................................101NVL...........................................................................................................................101UID...........................................................................................................................101USER........................................................................................................................101USERENV................................................................................................................101VSIZE.......................................................................................................................101PROBLEMA PROPOSTO: .......................................................................................102

    Resoluo..................................................................................................................1028. COMANDOS................................................................................................................................103

    LABELS................................................................................................................................103EXIT.......................................................................................................................................103IF THEN ELSE......................................................................................................................104LOOP....................................................................................................................................105

    PROBLEMA PROPOSTO: .......................................................................................106RESOLUO.............................................................................................................106

    WHILE LOOP........................................................................................................................107PROBLEMA PROPOSTO: .......................................................................................107

    RESOLUO:............................................................................................................107FOR LOOP............................................................................................................................108GOTO....................................................................................................................................109NULL.....................................................................................................................................109

    PROBLEMA PROPOSTO: .......................................................................................109RESOLUO:............................................................................................................110

    9. COMUNICAO COM O SQL.................................................................................................110OPEN CURSOR ...................................................................................................................110CURSOR LOOP....................................................................................................................111

    PROBLEMA PROPOSTO:........................................................................................111RESOLUO:............................................................................................................112

    10. TRATAMENTO DE ERROS....................................................................................................112EXCEES PR-DEFINIDAS..............................................................................................113

    __________________________________________________________________________________________

  • __________________________________________________________________________________________

    PROBLEMA PROPOSTO: .......................................................................................114RESOLUO:............................................................................................................114

    EXCEES DEFINIDAS PELOS USURIOS.....................................................................115RAISE.......................................................................................................................115PRAGMA EXCEPTION_INIT....................................................................................115RAISE_APPLICATION_ERROR..............................................................................116PROPAGAO DA EXCEO................................................................................116SQLERRM................................................................................................................117

    11. SUBPROGRAMAS ...................................................................................................................117PROCEDURES.....................................................................................................................118DECLARAES FORWARD...............................................................................................119STORED SUBPROGRAMS..................................................................................................120

    CHAMADAS DE UM STORED PROGRAM..............................................................120CRIANDO UM STORED SUBPROGRAM................................................................120

    12. DATABASE TRIGGERS..........................................................................................................12113. PACKAGES................................................................................................................................123

    CRIANDO UM PACKAGE....................................................................................................123VANTAGENS DO USO DE PACKAGES..............................................................................124REFERNCIAS A packageS................................................................................................125

    14. MENSAGENS EM STORED PROCEDURES E TRIGGERS...............................................125EXEMPLO.............................................................................................................................125Procedures e Funes........................................................................................................125

    DISABLE PROCEDURE...........................................................................................125ENABLE PROCEDURE............................................................................................126GET_LINE PROCEDURE.........................................................................................126GET_LINES PROCEDURE......................................................................................126NEW_LINE PROCEDURE .......................................................................................126PUT PROCEDURE ..................................................................................................127PUT_LINE.................................................................................................................127EXEMPLO................................................................................................................127

    __________________________________________________________________________________________

  • __________________________________________________________________________________________

    GUIA DE REFERENCIA DE PL/SQL COM BASE ORACLE

    1. CONCEITOA PL/SQL uma linguagem procedural do ORACLE, extenso ao SQL. Este captulo da apostila tem o objetivo de dar uma viso geral da linguagem e suas potencialidades. Atravs de exemplos simples veremos a aplicabilidade da linguagem. No fim do captulo esto transcritos os principais comandos e sua sintaxe. Com a PL/SQL pode-se usar comandos SQL para manipular os dados da base ORACLE e fluxos de controle para processar os dados. Pode-se declarar constantes e variveis, definir subprogramas (procedures ou funes) e controlar erros de execuo.

    2. ESTRUTURAA PL/SQL uma estrutura em blocos, ou seja, as unidades bsicas (procedures, funes, etc.) podem conter qualquer nmero de sub-blocos. Um bloco permite que se faam declaraes associadas ao bloco e que deixam de existir quando o bloco termina.

    Cada bloco composto basicamente de 3 partes:

    DECLARE ______________ opcional

    BEGIN ___________________ obrigatriaEXCEPTION

    _____________ opcional

    END;

    A ordem das partes lgica, ou seja, primeiro deve-se efetuar as declaraes, para depois utilizar (na lgica) as variveis criadas. As excees ocorridas durante a execuo podem ser resolvidas na parte referente a erros.

    Exemplo:

    DECLAREw_salario NUMBER(5);

    BEGINSELECT vl_sal INTO w_salario FROM funcWHERE cd_mat = 150FOR UPDATE OF;

    IF w_salario < 800THEN

    UPDATE funcSET salario = w_salario * 1.3

    WHERE cd_mat = 150;ELSE

    UPDATE funcSET vl_sal = w_salario * 1.15

    WHERE cd_mat = 150;END IF;

    COMMIT;END;

    __________________________________________________________________________________________81

  • __________________________________________________________________________________________

    3. ARQUITETURAO mdulo executvel da PL/SQL pode ser instalado no RDBMS ou em softwares aplicativos tais como: SQL*REPORT, SQL*FORMS, SQL*MENU. Estes dois ambientes (RDBMS e aplicativos) so independentes. No ambiente instalado, a PL/SQL aceita como entrada qualquer bloco ou subprograma escrito na linguagem. Quando a instalao feita no RDBMS, possvel a incluso de rotinas em PL/SQL nos aplicativos das host languages. possvel ainda, a compilao separada de subprogramas e armazenamento na base de dados ORACLE, que sero lidos a tempo de execuo. Um Subprograma explicitamente criado usando uma ferramenta do ORACLE chamado de stored subprogram, que uma vez compilado e armazenado no dicionrio de dados, poder ser chamado por qualquer nmero de aplicaes conectadas base de dados.

    Ex.: no SQL *PLUS

    SQL> execute teste (DILSON)

    4. COMPONENTES DA LINGUAGEM

    IDENTIFICADORES

    Consiste de uma letra opcionalmente seguida de nmeros, $, _ ou #. As letras podem ser minsculas ou maisculas.

    Ex.: Legais Ilegaismoney$$$tree teste&testeab### cd_deptonovo_teste_ nmfunc

    PALAVRAS RESERVADAS

    Palavras que possuam um significado especial para a SQL.

    Ex.: BEGINEND

    LITERAIS

    uma representao explcita de um nmero, caracter, string ou boleano, no representado por um identificador.Ex.:

    Numricos Caracteres Strings Boleanos030 Z 10-NOV-91 TRUE6 % hello,world FALSE-14 7+32767 .12.0 ..5 z2E5 (-9.5E-3

    __________________________________________________________________________________________82

  • __________________________________________________________________________________________

    COMENTRIOS:O incio do comentrio marcado por dois hfens em qualquer ponto da linha. O restante da linha considerado comentrio. Para comentrios que ultrapassem uma linha, pode-se usar a notao /* (inicio) e */(fim).

    Ex.:SELECT vl_sal INTO w_salario obtm o salrio atual

    /* calculo da bonificao */IF w_salario > 50000

    5. DECLARAES

    TIPOS DE VARIAVEIS

    Cada constante ou varivel possui um tipo que especifica o formato de armazenamento, restries e intervalo de valores. O dado pode ser simples ou composto.

    SUBTIPOS So associados aos tipos com uma restrio, que indiquem um subconjunto de valores.

    VARIVEIS SIMPLES

    BINARY INTEGER numrico, para armazenamento de valores inteiros de -2**31 a (2**31) - 1

    sintaxe: binary_integer

    subtipos: natural -de 0 a (2**31) -1positive -de 1 a (2**31) -1

    NUMBER numrico, para armazenamento de valores em ponto flutuante com preciso de at 38 dgitos.

    sintaxe: number [ (,) ]

    subtipos: dec idem a numberdecimal idem a numberdouble precision idem a numberfloat idem a numberinteger idem a numberint idem a numbernumeric idem a numberreal idem a numbersmallint idem a number

    CHAR alfanumrico de tamanho fixo com at 32767 caracteres.

    sintaxe: char [ () ]

    subtipo: string idem a char

    LONG alfanumrico de tamanho varivel com comprimento de at 32760.

    sintaxe: long

    __________________________________________________________________________________________83

  • __________________________________________________________________________________________

    VARCHAR2 alfanumrico de tamanho varivel com comprimento de at 32767.

    sintaxe: varchar2 [() ]

    subtipo: varchar idem a varchar2

    RAW para armazenamento de dados binrios (tam.mx. at 32767).

    sintaxe: raw ()

    LONG RAW para armazenamento de dados binrios at o tamanho de 32760.

    sintaxe: long raw

    BOOLEAN valores boleanos (true, false, ou null).

    DATE armazenamento de datas.

    sintaxe: date

    ROWID valores de rowiddo Oracle (em hexadecimal).

    sintaxe: rowid

    formato: BBBBBBBBB.RRRR.FFFFonde:BBBBBBBBB - bloco dentro do arquivo (database file)RRRR - row dentro do bloco ( primeira row 0)FFFF - nmero do arquivo (database file)

    ATRIBUTOS ESPECIAIS

    As variveis PL/SQL e constantes possuem atributos, que so propriedades que permitem a referncia ao tipo e estrutura do objeto sem necessidade de repetio de sua definio. As tabelas e colunas do database possuem atributos similares, que podemos usar para facilitar a manuteno.

    %TYPE este atributo copia os atributos de uma varivel, constante ou coluna do database. particularmente usado quando declaramos variveis que pertenam as colunas do database.

    sintaxe: //%TYPE

    Ex.:

    DECLAREW_CODIGO NUMBER(3)W_CODIGO2 W_CODIGO%TYPE; - varivel de tipo idntico a cdigoW_COD_DEP DEPTO.CD_DEPTO%TYPE

    /* varivel de tipo idntico varivel da base de dados cd_depto */

    __________________________________________________________________________________________84

  • __________________________________________________________________________________________

    %ROWTYPE este atributo gera um tipo de registro que representa uma linha da tabela. O registro pode armazenar uma linha de dados selecionados da tabela ou recebidos de um cursor (fetched).

    sintaxe: /%ROWTYPE

    Ex.:

    DECLAREW_DEP_ROW DEPTO%ROWTYPE; - varivel do tipo rowW_MAT NUMBER(3);CURSOR W_C1 Ls - cursor com apenas 2 colunasSELECT CD_DEPTO,NM_DEPTOFROM DEPTO; - colunas da tabelaW_C1_ROW WC1%ROWTYPE; - possui as mesmas colunas de

    W_C1

    BEGIN

    SELECT * INTO W_DEP_ROW - contm todos os dados lidos FROM FROM depto - da linha da tabelaWHERE cd_mat = W_MAT;IF W_DEP_ROW.CD_DEPTO = 00 - a referncia a cada campo THEN

    - feita com o uso da varivel de tipo ROWTYPE

    PROBLEMA PROPOSTOSuponhamos a existncia de uma tabela (RESULTADO) com o layout (VALOR N (30), ORDEM N(5)). Deseja-se preench-la a partir da tabela funcionrio, com a matrcula do funcionrio (ordem) e a expresso trunc(nr_git*vl_sal/nr_cargo) na coluna valor.

    RESOLUO 1:

    DECLAREw_reg_func FUNC%ROWTYPE;CURSOR w_c1 lS

    SELECT * FROM func ORDER BY cd_mat;BEGIN

    OPEN w_c1;LOOP

    FETCH w_c1 INTO w_reg_func;EXIT WHEN w_c1%NOTFOUND;INSERT INTO resultado (ordem,valor)VALUES (w_reg_func.cd_mat, trunc(w_reg_func.nr_git * w_reg_func.vl_sal / w_reg_func.nr_cargo));

    ENDLOOP;CLOSE w_c1;

    END;

    __________________________________________________________________________________________85

  • __________________________________________________________________________________________

    RESOLUO 2

    DECLARECURSOR w_c1 lS

    SELECT cd_mat, nr_git, vl_sal, nr_cargo FROM func;w_reg_func w_c1%ROWTYPE;

    BEGINOPEN w_c1;LOOP

    FETCH w_c1 INTO w_reg_func;EXIT WHEN w_c1%NOTFOUND;INSERT INTO resultado (ordem,valor)VALUES (w_reg_func.cd_mat, trunc(w_reg_func.nr_git * w_reg_func.vl_sal / w_reg_func.nr_cargo));

    END LOOP;CLOSE w_c1;

    END

    VARIVEIS COMPOSTAS

    TABLE - tabelas na PL/SQL podem ter somente uma coluna e uma primary key, nenhuma das quais nomeadas. A declarao cria um tipo de varivel. Deve ser feita uma declarao de varivel com o tipo criado posteriormente para uso.

    sintaxe: TYPE IS TABLE OF{ / .%TYPE}[NOT NULLl] INDEX BY BINARY_INETGER

    Ex.:

    DECLARETYPE tab IS TABLE OF char(10)

    INDEX BY BINARY_INTEGER;teste TAB;

    teste (1) := 1234567890;teste (-1) := -1234567890;

    RECORD - Permite a criao de um item estruturado.

    sintaxe: TYPE IS RECORD({/.%TYPE}[NOT NULL], {/.%TYPE}[NOT NULL] ...)

    __________________________________________________________________________________________86

  • __________________________________________________________________________________________

    Ex.:

    DECLARETYPE registro IS RECORD(depto CHAR(03) NOT NULL,nome DEPTO. NM_DEPTO%TYPE);

    outro_reg REGISTRO;reg_teste REGISTRO;

    ...........

    REG_TESTE.DEPTO := A00;SELECT cd_depto, nm_depto INTO outro_reg FROM DEPTOWHERE cd_depto = D11;

    Ex.:

    DECLARETYPE tab is table of CHAR(2) INDEX BY BINARY_INTEGER;TYPE registro IS RECORD (a1 TAB, a2 CHAR(1));

    teste REGISTRO;

    BEGINteste.a1 (1) := aa;teste.a1 (2) := bb;teste.a1 (3) := cc;

    __________________________________________________________________________________________87

  • __________________________________________________________________________________________

    PROBLEMA PROPOSTODeseja-se saber, para cada cargo, a quantidade de funcionrios por departamento. O nome do cargo deve ser apresentado no resultado.

    RESOLUO:

    DECLARETYPE t_cargo IS TABLE OF char(25)

    INDEX BY BINARY_INTEGER;TYPE t_codigo IS TABLE OF number(3)

    INDEX BY BINARY_INTEGER;cargo T_CARGO;cod_cargo T_CODIGO;CURSOR w_c1 IS

    SELECT func.cd_depto, nr_cargo, nm_depto, count(*) contaFROM func, deptoWHERE func.cd_depto = depto.cd_deptoGROUP BY func.cd_depto, nm_depto, nr_cargo;

    w_c1_row w_c1%ROWTYPE;BEGIN

    cod_cargo(1) := 42;cargo(1) := OPERADORcod_cargo(2) := 43;cargo(2) := DIGITADOR...OPEN w_c1;LOOP

    FETCH w_c1 INTO w_c1_row;EXIT WHEN w_c1%NOTFOUND;FOR i IN 1..12 LOOP

    IF cod_cargo(i) =w_c1_row.nr_cargoTHEN

    INSERT INTO saida(valor, texto, qtd)VALUES(w_c1_row.cd_depto, to_char(w_c1_row.nr_cargo)ll llcargo(i),w_c1_row.conta);EXIT;

    END IF;END LOOP;

    END LOOP;END;

    CONSTANTES

    A declarao de uma constante semelhante declarao de uma varivel, exceto que devemos adicionar a palavra chave CONSTANT e, imediatamente, associar um valor inicial. Seu valor no poder ser alterado durante o programa.

    sintaxe: CONSTANTE :=/DEFAULT ;

    Ex.:

    DECLARE W_TESTE CONSTANT REAL := 3.14159;

    W_TESTE1 CONSTANT REAL DEFAULT := 3.14159;

    __________________________________________________________________________________________88

  • __________________________________________________________________________________________

    CONVERSO DE TIPO DE VARIVEL

    Pode-se converter de um tipo de varivel para outro explicitamente, porm, em muitas situaes a PL/SQL pode converter o tipo de caracter em outro, implicitamente. Isto ocorre quando usamos varivel de um tipo onde era esperado outro. A PL/SQL utiliza uma das seguintes funes para executar esta converso:

    TO_CHAR TO_DATETO_VARCHAR2 TO_NUMBERCHARTOROWID ROWIDTOCHARHEXTORAW RAWTOHEXTO_BINARY_INTEGER

    EXEMPLOS DE DECLARAES

    DECLARE W_DATA DATE; - varivel de tipo data W_CONTADOR SMALLINT := 0; - varivel iniciada com zero W_CODIGO CHAR(O3)NOT NULL := A00 - varivel c/ restrio W_TESTE CONSTANT REAL := 3.14159; - /* constante de tipo real - o valor

    inicial obrigatrio */ W_CODIGO2 W_CODIGO%TYPE := B01 - varivel de tipo idntico a cdigo W_COD_DEP DEPTO.CD_DEPTO%TYPE - varivel de tipo idntico a varivel da

    da base de dados cd_depto W_DEP_ROW DEPTO%ROWTYPE - varivel tipo row

    CURSOR W_C1 IS - cursor c/ 2 colunas da tabela SELECT cd_depto, nm_depto FROM DEPTO; W_C1_ROW W_C1%ROWTYPE - possui as mesmas colunas de w_c1

    BEGIN SELECT * INTO W_DEP_ROW FROM DEPTO WHERE cd_depto = A00; IF W_DEP_ROW.cd_DEPTO = A00 THEN W_CONTADOR := WHERE_CONTADOR + 1; END IF;END

    VARIVEIS ESPECIAIS

    EXCEPTION - nomeia uma exceo definida pelo usurio.

    sintaxe: EXCEPTION

    Ex.:

    DECLARE erro_matrcula EXCEPTION;

    CURSOR - declara um cursor.

    __________________________________________________________________________________________89

  • __________________________________________________________________________________________

    sintaxe:CURSOR [( [,

  • __________________________________________________________________________________________

    %ISOPEN - permite que se verifique se um cursor est aberto ou no. No caso de cursores implcitos o resultado ser sempre FALSE, uma vez que o Oracle fecha o cursor aps uma operao.

    sintaxe: %ISOPENSQL%ISOPEN

    Ex.:

    IF NOT (w_c1%ISOPEN)THEN...

    %ROWCOUNT - indica o nmero de rows lidas para o cursor associado (para cursores explcitos) ou o nmero de rows afetadas no ltimo comando INSERT, UPDATE, DELETE ou SELECT (para cursores implcitos). Aps a abertura do cursor, o valor de ROWCOUNT zero. O nmero s ser incrementado SE O LTIMO FETCH retornou uma row.

    sintaxe: %ROWCOUNTSQL %ROWCOUNT

    Ex.:

    LOOP FETCH w_c1 INTO w_c1_row;IF w_c1% ROWCOUNTTHEN

    ...

    PROBLEMA PROPOSTO Deseja-se calcular e emitir a folha de pagamento de uma empresa. Em funo da necessidade de se emitir vrios relatrios sobre o clculo efetuado, ser gerada uma tabela intermediria com os resultados para posterior impresso.

    RESOLUO:

    DECLARE CURSOR w_c1 IS SELECT cd_mat, vl_sal, vl_sal * .10 fgts FROM func;w_c1_row w_c1 %ROWTYPE;w_vl_lim NUMBER(15,2) :=&1;w_vl_ir NUMBER(15,2) := 0;w_vl_inss NUMBER(15,2) := 0tabela invlida EXCEPTION;PROCEDURE ir (val_sal IN NUMBER, val_ir OUT NUMBER) IS BEGIN

    IF val_sal < 300.00 THENval_ir := 0;ELSIF val_sal BETWEEN 300.01 AND 1000.00 THEN

    val_ir := val_sal *10;ELSIF val_sal BETWEEN 1000.01 AND 3000.00 THEN

    val_ir := val_sal *20;ELSE

    val_ir := val_sal *30;END IF;

    END;FUNCTION inss (val_sal IN NUMBER, val_lim IN NUMBER) RETURN NUMBERISval_inss NUMNER(15,2);BEGIN

    __________________________________________________________________________________________91

  • __________________________________________________________________________________________

    val_inss := val_sal *.08;IF val_inss := > val_lim THEN

    val_inss := val_lim;END IF;RETURN val_inss;

    END inss;

    BEGIN DELETE FROM folha;COMMIT;OPEN w_c1;LOOP

    FETCH w_c1 INTO w_c1_row;EXIT WHEN w_c1%NOTFOUND;ir(w_c1_row.vl_sal, w_vl_ir);w_vl_inss := inss(w_c1_row.vl_sal,w_vl_lim);INSERT INTO folha (cd_mat, vl_sal, vl_ir, vl_inss, vl_fgts)VALUES (w_c1_row.cd_mat, w_c1_row.vl_sal, w_vl_ir, w_vl_inss,w_c1_row.fgts);

    END LOOP;CLOSE w_c1;COMMIT;END;

    6. ATRIBUIESAs variveis e constantes so inicializadas cada vez que iniciado o bloco em que elas esto declaradas. Por default, as variveis so inicializadas com NULL. importante, portanto que as variveis antes de serem usadas sejam inicializadas.

    Ex.:sim_no boolean;...sim_no := (contador > 500);

    IF sim_no IS NULL - verifica se uma varivel tem o valor = NULLTHEN

    7. FUNES PR-DEFINIDASA PL/SQL permite a utilizao de diversas funes pr-definidas para manipulao dos dados. Pode-se us-las onde expresses do mesmo tipo so permitidas.

    CONTROLE DE ERROS

    SQLCODEFuno numrica que retorna o cdigo do erro associado ltima exceo.

    Definio: FUNCTION SQLCODE RETURN NUMBEREx.: := SQLCODE;

    SQLERRMFuno string que retorna a mensagem de erro associado ao ltimo SQLCODE.Definio: FUNCTION SQLERRM [(error_number NUMBER)] RETURN CHAR

    __________________________________________________________________________________________92

  • __________________________________________________________________________________________

    Ex.: := SQLERRM(-1023);

    NUMRICAS

    ABSRetorna o valor absoluto do argumento.

    Definio: FUNCTION ABS ( NUMBER) RETURN NUMBEREx.: := ABS ();

    CEILRetorna o menor inteiro maior ou igual ao argumento.

    Definio: FUNCTION CEIL( NUMBER) RETURN NUMBEREx.: := CEIL ();

    COSRetorna o coseno do argumento, que deve ser expresso em radianos.

    Definio: FUNCTION COS ( NUMBER) RETURN NUMBEREx.: := COS ();

    Obs.: se estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.

    COSHRetorna o coseno hiperblico do argumento.

    Definio: FUNCTION COSH ( NUMBER) RETURN NUMBEREx.: := ABS ();

    EXPRetorna e elevado n-esima potncia, onde e (~2.71828) a base do logaritmo neperiano.

    Definio: FUNCTION EXP ( NUMBER) RETURN NUMBEREx.: := EXP ();

    FLOORRetorna o maior inteiro menor ou igual ao argumento.

    Definio: FUNCTION FLOOR( NUMBER) RETURN NUMBEREx.: := FLOOR ();

    LNRetorna o logaritmo natural do argumento, que deve ser maior que zero. Definio: FUNCTION LN ( NUMBER) RETURN NUMBEREx.: := LN ();

    __________________________________________________________________________________________93

  • __________________________________________________________________________________________

    LOGRetorna o logaritmo de na base , sendo que deve ser maior que 1 e deve ser maior que 1 e deve ser maior que zero.

    Definio: FUNCTION LOG ( NUMBER) RETURN NUMBEREx.: := LOG ();

    MODRetorna o resto da diviso de por . Se for zero, retornado.

    Definio: FUNCTION MOD ( NUMBER) RETURN NUMBEREx.: := MOD (), ();

    POWER

    Retorna o nmero elevado -sima potncia. Se for negativo, deve ser inteiro.

    Definio: FUNCTION POWER ( NUMBER) RETURN NUMBEREx.: := POWER ();

    ROUNDRetorna arredondado para casas decimais. Se for omitido, zero ser assumido.

    Definio: FUNCTION ROUND ( NUMBER) RETURN NUMBEREx.: := ROUND (), ();

    SIGNRetorna 1 se o argumento for negativo, 0 se igual a zero ou 1 se o argumento for maior que zero.

    Definio: FUNCTION SIGN ( NUMBER) RETURN NUMBEREx.: := SIGN ();

    SINRetorna o seno de , que deve ser expresso em radianos.

    Definio: FUNCTION EXP ( NUMBER) RETURN NUMBEREx.: := SIN ();

    Obs.: Se estiver em graus, basta que seja dividido por 57.29578 para ser convertido para radianos.

    SINHRetorna o seno hiperblico do argumento.

    Definio: FUNCTION SINH ( NUMBER) RETURN NUMBEREx.: := SINH ();

    SQRTRetorna a raiz quadrada do argumento, que no pode ser negativo.

    Definio: FUNCTION SQRT ( NUMBER) RETURN NUMBEREx.: := SQRT ();

    __________________________________________________________________________________________94

  • __________________________________________________________________________________________

    TANRetorna a tangente de , que deve ser expresso em radianos.

    Definio: FUNCTION TAN ( NUMBER) RETURN NUMBEREx.: := TAN ();

    TANHRetorna a tangente hiperblica do argumento.

    Definio: FUNCTION TANH ( NUMBER) RETURN NUMBEREx.: := TANH ();

    TRUNCRetorna o nmero truncado para casas decimais. Se o for omitido, zero ser assumido.

    Definio: FUNCTION TRUNC ( NUMBER) RETURN NUMBEREx.: := TRUNC ();

    CARACTERES

    ASCIIRetorna o cdigo ASCII correspondente string informada no argumento.

    Definio: FUNCTION ASCII ( VARCHAR2) RETURN NUMBEREx.: := ASCII ();

    CHRRetorna a string correspondente representao numrica informada como argumento. o contrario da funo ASCII.

    Definio: FUNCTION CHR ( NUMBER) RETURN CHREx.: := CHR ();

    CONCATRetorna uma string que o resultado da concatenao de (na frente) com .

    Definio: FUNCTION CONCAT ( VARCHAR2, VARCHAR2) RETURN VARCHAR2Ex.: := CONCAT (,);

    INITCAPRetorna a primeira letra de cada palavra do argumento em letra maiscula e as demais em minsculas.

    Definio: FUNCTION INITCAP ( VARCHAR2) RETURN VARCHAR2Ex.: := INITCAP ();

    INSTRRetorna a posio da -sima ocorrncia de dentro de , comeando na posio .

    __________________________________________________________________________________________95

  • __________________________________________________________________________________________

    Definio: FUNCTION INSTR ( VARCHAR2, VARCHAR2) [ NUMBER [, NUMBER ]]) RETURN NUMBER

    Ex.: := INSTR (, ,,);

    LENGTHRetorna o nmero de caracteres da string . Se o argumento um item definido como CHAR, o comprimento incluir os brancos. Se for null, o resultado da funo ser NULL.

    Definio: FUNCTION LENGTH ( VARCHAR2) RETURN NUMBEREx.: := LENGTH ();

    LOWERRetorna o argumento com todas as letras minsculas.

    Definio: FUNCTION LOWER ( VARCHAR2) RETURN VARCHAR2Ex.: := LOWER ();

    LPADCompleta esquerda, com os caracteres para que o tamanho da string resultado seja .

    Definio: FUNCTION LPAD ( VARCHAR2, NUMBER [, VARCHAR2]) RETURN

    VARCHAR2Ex.: := LPAD (, ,*);

    LTRIMRetira , da esquerda para direita, os caracteres at que seja encontrado um caracter diferente de .

    Definio: FUNCTION LTRIM ( VARCHAR2 [, VARCHAR2]) RETURN VARCHAR2Ex.: := LTRIM (, );

    REPLACERetorna com cada ocorrncia de substituda por . Se no for informado, todas as ocorrncias se sero removidas. Se nem nem forem informadas a funo retornar NULL.

    Definio: FUNCTION REPLACE ( VARCHAR2, VARCHAR2[, VARCHAR2]) RETURN VARCHAR2

    Ex.: := REPLACE (, ,,*);

    RTRIMRetira , da direita para esquerda, os caracteres at que seja encontrado um caracter diferente de .

    __________________________________________________________________________________________96

  • __________________________________________________________________________________________

    Definio: FUNCTION RTRIM ( VARCHAR2 [, VARCHAR2]) RETURN VARCHAR2Ex.: := RTRIM (, );

    SOUNDEXRetorna um string que represente o som de .

    Definio: FUNCTION SOUNDEX ( VARCHAR2) RETURN VARCHAR2Ex.: := SOUNDEX ();

    SUBSTRRetorna uma parte da string , a partir da posio por caracteres. Se l for omitido, retorna o restante da string.

    Definio: FUNCTION SUBSTR ( VARCHAR2, NUMBER [, NUMBER]) RETURN VARCHAR2

    Ex.: := SUBSTR (, , );

    TRANSLATERetorna , substituindo cada um dos caracteres presentes em pelo caracter correspondente em . Se tiver mais caracteres que , e esses caracteres estiverem presentes em , sero removidos do resultado.

    Definio: FUNCTION TRANSLATE ( VARCHAR2, VARCHAR2, CHAR) RETURN VARCHAR2

    Ex.: := TRANSLATE (, ABCDEF, GHIJKL);

    UPPERRetorna o argumento com todas as letras maisculas.

    Definio: FUNCTION UPPER ( VARCHAR2) RETURN VARCHAR2Ex.: := UPPER (texto);

    DATAS

    ADD_MONTHSRetorna a data adicionada de meses.

  • __________________________________________________________________________________________

    NEW_TIMEConverte a data e hora que est no meridiano , para a data e hora no meridiano .

    Definio: FUNCTION NEW_TIME ( DATE, VARCHAR2, VARCHAR2) RETURN DATE

    Ex.: := NEW_TIME (v_dt_nasc, AST,GMT);

    ABREVIATURAS PARA MERIDIANOS

    AST,ADT Atlantic Standard ou Daylight TimeGMT GreenwitchPST, PDT Pacific Standard ou Daylight Time

    NEXT_DAYRetorna a data do primeiro dia da semana nomeado por que seja posterior a .

    Definio: FUNCTION NEXT_DAY ( DATE, VARCHAR2) RETURN DATEEx.: := NEXT_DAY (sysdate, moday);

    SYSDATERetorna a data e hora correntes.

    Definio: FUNCTION SYSDATE RETURN DATEEx.: := SYSDATE ;

    ROUNDRetorna arredondado para o formato especificado.

    Definio: FUNCTION ROUND ( [,]) RETURN DATEEx.: := ROUND (sysdate,ww);

    TRUNCRetorna uma data no formato especificado por , representado truncada na unidade correspondente.

    Definio: FUNCTION TRUNC ( DATE [, VARCHAR2 ) RETURN DATEEx.: := TRUNC (sysdate,ww);

    FORMATOS PARA ROUND E TRUNC

    CC SculoSYYY, YYYY, YEAR, SYEAR, YYY, YY, Y AnoQ Quarto de anoMONTH, MON, MM MsWW Incio da semana do anoWHERE Incio da semana do msDDD, DD, J DiaDAY, DY, D ltimo SbadoHH, HH12, HH24 HoraMI Minuto

    __________________________________________________________________________________________98

  • __________________________________________________________________________________________

    CONVERSO

    CHARTOROWIDConverte a string do tipo CHAR ou VARCHAR2 para ROWID.

    Definio: FUNCTION CHARTOROWID ( CHAR) RETURN ROWIDEx.: := CHARTOROWID (00000000E.0000007);

    HEXTORAWConverte uma string hexadecimal do tipo CHAR ou VARCHAR2 para RAW.

    Definio: FUNCTION HEXTORAW ( CHAR) RETURN RAWEx.: FUNCTION HEXTORAW ( VARCHAR2) RETURN RAW

    := HEXTORAW (F6);

    RAWTOHEXConverte um valor binrio em uma string hexadecimal do tipo VARCHAR2.

    Definio: FUNCTION RAWTOHEX ( RAW) RETURN VARCHAR2Ex.: := RAWTOHEX (

  • __________________________________________________________________________________________

    FORMATOS DE NLS

    NLS_DATE_LANGUAGE = ________________para NLS_NUMERIC_CHARACTERS = ,NLS_CURRENCY = NLS_ISSO_CURRENCY = ____________ para

    Onde:

    caracter decimal separador de milhar smbolo monetrio

    TO_DATEConverte uma string ou um nmero para o formato data.

    Definio: FUNCTION TO_DATE ( VARCHAR2[, VARCHAR2 [,]])RETURN DATE

    Ex.: := TO_DATE (12/01/84, dd/mm/yy)

    FORMATOS DE DATA PARA TO_CHAR E TO_DATE

    CC, SCC SculoSYYY, YYYY, YEAR, SYEAR, YYY, YY, Y AnoQ Quarto de anoMONTH Ms por extensoMON Ms abreviado para trs letrasMM Ms (numrico)WW Semana do anoWHERE Semana do msWHERE Incio da semana do msDDD Dia do anoDD Dia do msD Dia da semanaDAY Nome do diaDY Dia abreviado p/ 3 letrasJ Dia em data JulianaHH, HH12, HH24 HoraMI MinutoSS Segundo

    TO_NUMBERConverte para o valor numrico correspondente.

    Definio: FUNCTION TO_NUMBER ( VARCHAR2 [, ]])RETURN NUMBER

    Ex.: := TO_NUMBER (5.678,32, 9.999,99, nls_numeric_characters = , .);

    MISCELNEA

    DECLARES permitido em comandos SQL.

    __________________________________________________________________________________________100

  • __________________________________________________________________________________________

    GREATESTRetorna a maior da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de dado da primeira antes da comparao ser feita.

    Definio: FUNCTION GREATEST (, ,...)Ex.: := GREATEST (aaaa, bbb, cccc);

    LEASTRetorna a menor da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de dado da primeira antes da comparao ser feita.

    Definio: FUNCTION LEAST (, ,...)Ex.: := LEAST(aaaa, bbb, cccc);

    NVLSe for null, retorna . Se no for null, retorna .

    Definio: FUNCTION NVL ((, ,) RETURN Onde: ser de tipo igual a e

    Ex.: := NVL (v_nr_gir,0);

    UIDRetorna o valor do inteiro associado a cada username pelo Oracle.

    Definio: FUNCTION UID RETURN NUMBEREx.: := UID;

    USERRetorna o username corrente.

    Definio: FUNCTION USER RETURN VARCHAR2Ex.: := USER;

    USERENVRetorna informaes sobre o user e a sesso.

    Definio: FUNCTION USERENV ( VARCHAR2) RETURN VARCHAR2Ex.: := USERENV (terminal);

    Valores de

    entryid identificador da entradasessionid Identificador da sessoterminal identificador do terminallanguage identificador da linguagem em uso

    VSIZERetorna o nmero de bytes usado para armazenar a representao interna de .

    Definio: FUNCTION VSIZE ( DATE l NUMBER l VARCHAR2) RETURN NUMBEREx.: := VSIZE (sysdate);

    __________________________________________________________________________________________101

  • __________________________________________________________________________________________

    PROBLEMA PROPOSTO: Gravar na tabela RESULTADO a quantidade de funcionrios por departamento, convertendo o cdigo do departamento da seguinte forma:

    departamentos AXX somar 100 ao nmero do departamento departamentos BXX somar 200 ao nmero do departamento e assim por diante

    RESOLUO

    DECLARE CURSOR w_c1 IS SELECT cd_depto,count(*) total FROM func GROUP BY cd_depto;W_c1_row w_c1%ROWTYPEw_cd_depto number(3);w_str_depto varchar(1);BEGIN

    OPEN w_c1;LOOP FETCH w_c1 INTO w_c1_row; IF w_c1%NOTFOUND THEN

    CLOSE w_c1;EXIT;

    ENDIF; W_str_depto := SUBSTR (w_c1_row.cd_depto, 1, 1); IF w_str_depto = ATHEN w_cd_depto := 100;

    ELSIF w_str_depto = B THEN w_cd_depto :=200;ELSIF w_str_depto = C THEN w_cd_depto :=300;ELSIF w_str_depto = D THEN w_cd_depto :=400;ELSIF w_str_depto = E THEN w_cd_depto :=500;

    END IF; w_cd_depto := w_cd_depto+ TO_NUMBER(SUBSTR(w_c1_row.cd_depto,2,2)); INSERT INTO RESULTADO (ordem, campo) VALUES

    (w_cd_depto,w_c1_row.total);END LOOP;

    END;

    __________________________________________________________________________________________102

  • __________________________________________________________________________________________

    8. COMANDOS

    LABELSIdentifica um comando ou conjunto de comandos. Utilizado para desvios e para qualificao.Deve existir um comando aps o LABEL.

    sintaxe:

    Ex.:

    FOR i IN 1..10 LOOP

    IF externo.iTHEN

    ...

    ENDIF;

    FOR i IN 1..10 LOOP

    IF inetrno iTHEN

    ...ENDIFEXIT externo WHEN... encerra ambos os loops

    END LOOP;END LOOP externo; -- este comando ilegal porque END no End; -- um comando executvel

    EXITEncerra um loop.

    sintaxe: EXIT [ ] [WHEN ]

    Ex.:LOOP

    FETCH w_c1 INTO w_c1_row;IF w_c1%FOUNDTHEN

    calc_ir........INSERT

    ELSEEXIT;

    ENDIFEND LOOP;

    __________________________________________________________________________________________103

  • __________________________________________________________________________________________

    IF THEN ELSEA seqncia de comandos s ser executada se a condio for verdadeira.

    sintaxe:IF THEN

    END IF;

    ouIF THEN

    ELSE

    END IF;

    ouIF THEN

    ELSIF THEN

    ELSE

  • __________________________________________________________________________________________

    Ex.:IF val_sal < 300.00THEN

    Val_ir := 0;ELSIF val_sal BETWEEN 300.01 AND 1000.00+THEN

    val_ir := val_sal * .10;ELSEIF val_sal BETWEEN 1000.01 and 3000.00THEN

    val_ir := val_sal * .20;ELSE

    val_ir := val_sal * .30;END IF;

    LOOPA seqncia de comandos executada num nmero infinito de vezes ou at que seja encontrado um comando EXIT ou a condio de WHEN seja satisfeita.

    sintaxe:

    [>]LOOP

    END LOOP

    ou LOOP

    IF ....THEN

    EXIT; -- encerra o loopEND IF;

    END LOOP;

    ouLOOP

    EXIT WHEN -- encerra o loop

    END LOOP;Ex.:

    OPEN w_c1;LOOP

    FETCH WHERE_C1 INTO w_c1_row;EXIT WHEN w_c1%NOTFOUND;calc_ir(w_c1_row.vl_sal,w_vl_lim);

    ...END LOOP;CLOSE w_c1;

    __________________________________________________________________________________________105

  • __________________________________________________________________________________________

    PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome, cdigo, salrio, mdia, totsal, totmd) com os valores abaixo obtidos na tabela de departamento:

    nome nome do departamento cdigo cdigo do departamento salrio somatrio dos salrios do departamento correspondente mdia mdia salarial do departamento correspondente totsal total de salrios da tabela de funcionrios totmd mdia da tabela de funcionrios total

    RESOLUO

    DECLARE w_tot_sal number(10,2);w_tot_med number(10,2);CURSOR w_ c1 ISSELECT nm_depto, depto.cd_depto, SUM(vl_sal)soma, AVG(vl_sal) mediaFROM func, deptoWHERE func.cd_depto = depto.cd_deptoGROUP BY nm_depto, depto.cd_depto;w_c1_row w_c1%ROWTYPE;

    BEGIN SELECT SUM(vl_sal) INTO w_tot_sal FROM func;SELECT AVG(vl_sal) INTO w_tot_med FROM func;OPEN w_c1;LOOP

    FETCH w_c1 INTO w_c1_row;IF w_c1%NOTFOUNDTHEN

    CLOSE w_c1EXIT;

    END IF;INSERT INTO tabdep (nome, cdigo, salrio, mdia, totsal, totmed)VALUES (w_c1_row.nm_depto, w_c1_row.cd_depto, w_c1_row.soma,w_c1_row.media, w_tot_sal, w_tot_med);

    END LOOP;END;

    __________________________________________________________________________________________106

  • __________________________________________________________________________________________

    WHILE LOOPA seqncia de comandos executada enquanto a condio for verdadeira. Antes de cada iterao do loop, a condio avaliada. Se for verdadeira, a seqncia de comandos executada.

    sintaxe:

    [>]WHILE LOOP

    END LOOP;

    Ex.:OPEN w_c1;FETCH w_c1 INTO w_c1_row;WHILE w_c1%FOUND LOOP

    ...INSERT INTO folha

    END LOOP;CLOSE w_c1;

    PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome, cdigo, salrio, mdia, totsal, totmd) com os valores abaixo obtidos na tabela de departamento

    nome nome do departamento cdigo cdigo do departamento salrio somatrio dos salrios do departamento correspondente mdia mdia salarial do departamento correspondente totsal total de salrios da tabela de funcionrios totmd mdia da tabela de funcionrios total

    Obs.:Este problema o mesmo anterior.

    RESOLUO:

    DECLAREw_tot_sal number(10,2);w_tot_med number(10,2);CURSOR w_c1 ISSELECT nm_depto, depto.cd_depto, SUM,(vl_sal)soma,AVG(vl_sal)mediaFROM func, deptoWHERE func.cd_depto = depto.cd_deptoGROUP BY nm_depto, depto.cd_depto;W_c1_row w_c1%ROWTYPE;

    BEGINSELECT SUM(vl_sal) INTO w_tot_sal FROM func;SELECT AVG(vl_sal) INTO w_tot_med FROM func;OPEN w_c1;FETCH w_c1 INTO w_c1_row;WHILE w_c1%FOUND LOOP

    INSERT INTO tabdep (nome, cdigo, salrio, mdia, totsal, totmed)VALUES(w_c1_row.nm_depto, w_c1_row.cd_depto, w_c1_row.soma, w_c1_row.media, w_tot_sal, w_tot_med);FETCH w_c1 INTO w_c1_row;

    END LOOP;END;

    __________________________________________________________________________________________107

  • __________________________________________________________________________________________

    FOR LOOP

    A seqncia de comandos executada um nmero fixo de vezes estabelecido no comando. No incio do comando a quantidade de vezes que o mesmo ser executado j conhecida, uma vez que no se pode alterar o valor de durante a iterao.

    sintaxe:[>]FOR IN [REVERSE] .. LOOP

    END LOOP;

    Ex.:

    FOR i IN 1..3 LOOP executa 3 vezes

    END LOOP; o comando vezes invlido, pois i s Vezes := i +1 existe no escopo do comando FOR

    FOR i IN incio..fim LOOP 15 duas variveis iTHEN... a referncia ao nvel

    END LOOP; externo feita atravsEND LOOP INCIO; do label

    esta forma de interrupoFOR i IN 1..25 LOOP do loop (exit when..)

    FOR i IN 1..10 LOOP encerra os dois nveis .. de loopsEXIT incio WHEN

    END LOOP;END LOOP incio;

    __________________________________________________________________________________________108

  • __________________________________________________________________________________________

    GOTO

    Desvia incondicionalmente para um label, o qual deve ser dentro do scopo e deve preceder um comando ou um bloco da PL/SQL.

    sintaxe: GOTO >

    Ex.:

    BEGIN

    GOTO inclui; desvio para o comando INSERT

    INSERT INTO func

    END;

    BEGIN

    BEGIN

    UPDATE func o desvio pode ser para traz

    END;GOTO altera; este label porque END

    END; no um comando executavl

    NULL

    Este comando explicitamente indica que no h ao a ser feita. Serve para compor certas situaes em que um comando exigido, mas nenhuma ao realmente necessria.

    sintaxe: NULL;

    Ex.:

    BEGIN o comando null resolveNULL; o problema anterior

    END;

    PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome, cdigo, salrio, mdia, totsal, totmd) com os valores abaixo obtidos na tabela de departamento:

    nome nome do departamento cdigo cdigo do departamento salrio somatrio dos salrios do departamento correspondente mdia mdia salarial do departamento correspondente totsal total de salrios da tabela de funcionrios totmd mdia da tabela de funcionrios total

    Obs: Este problema o mesmo anterior.

    __________________________________________________________________________________________109

  • __________________________________________________________________________________________

    RESOLUO:

    DECLAREw_tot_sal number(10,2)w_tot_med number(10,2)CURSOR w_c1 ISSELECT nm_depto, depto.cd_depto, SUM(vl_sal) soma, AVG(vl_sal)mediaFROM func, deptoWHERE func.cd_depto = depto.cd_depto;GROUP BY nm_depto, depto.cd_depto;w_c1_row w_c1% ROWTYPE;

    BEGIN SELECT SUM(vl_sal) INTO w_tot_sal FROM func:SELECT AVG(vl_sal) INTO w_tot_med FROM func;OPEN w_c1;>FETCH w_c1 INTO w_c1_row;IF w_c1%FOUNDTHEN

    INSERT INTO tabdep (nome, cdigo, salrio, mdia, totsal, totmd)VALUES (w_c1row.nm_depto, w_c1_row.cd_depto,w_c1_row.soma),w_c1_row.media, w_tot_sal, w_tot_med);GOTO ler;

    END IF;END;

    9. COMUNICAO COM O SQLPor ter uma extenso do SQL, a PL*SQL permite a utilizao de quase todos os comandos SQL. Foram excludos desta lista dos comandos de DDL (ALTER, CREATE, RENAME,...) e os de DDL (GRANT, REVOKE,...).

    Consideramos que a sintaxe dos comandos SQL j de conhecimento dos leitores e no sero repetidos nesta apostila.

    OPEN CURSOR

    Executa o query associado com uma declarao explcito de cursor.

    sintaxe: OPEN [( [, ...])]

    Ex.:

    DECLARE CURSOR w_c2 (matrcula NUMBER) IS

    SELECT nm_func, cd_matFROM func

    WHERE cd_mat

  • __________________________________________________________________________________________

    CURSOR LOOP

    Implicitamente declara uma rea para receber a row, abre um cursor, l cada row e fecha o cursor quando todas as rows tiverem sido processadas.

    sintaxe: [>]FOR IN [( [, ...])] LOOP

    END LOOP;

    Ex.:DECLARE

    CURSOR w_c2 IS SELECT cd_mat, vl_sal, vl_sal * .10 fgtsFROM func;

    ...BEGIN

    DELETE FROM folha;COMMIT;FOR w_c2_row IN w_c2 LOOP

    calc_ir(w_c2_row.vl_sal, w_vl_ir);w_vl_inss := calc_inss(w_c2_row.vl_sal, w_vl_lim);INSERT INTO folha

    (cd_mat, vl_sal, vl_ir, vl_inss, vl_fgts)VALUES

    (w_c2_row.cd_mat, w_c2_row.vl_sal,w_vl_ir, w_vl_inss, w_c2_row.fgts);

    END LOOP;COMMIT;

    END;

    PROBLEMA PROPOSTO:Preencher a tabela TABDEP (nome, cdigo, salrio, mdia, totsal, totmd) com os valores abaixo obtidos na tabela de departamento:

    nome nome do departamento cdigo cdigo do departamento salrio somatrio dos salrios do departamento correspondente mdia mdia salarial do departamento correspondente totsal total de salrios da tabela de funcionrios totmd mdia da tabela de funcionrios total

    Obs: Este problema o mesmo anterior.

    __________________________________________________________________________________________111

  • __________________________________________________________________________________________

    RESOLUO:

    DECLAREw_tot_sal number(10,2)w_tot_med number(10,2)CURSOR w_c1 ISSELECT nm_depto, depto.cd_depto, SUM(vl_sal) soma, AVG(vl_sal)mediaFROM func, deptoWHERE func.cd_depto = depto.cd_depto;GROUP BY nm_depto, depto.cd_depto;

    BEGIN SELECT SUM(vl_sal) INTO w_tot_sal_ FROM func;SELECT AVG(vl_sal) INTO w_tot_med_ FROM func;FOR w_c1row IN w_c1 LOOP

    INSERT INTO tabdep (nome, cdigo, salrio, mdia, totsal, totmd)VALUES (w_c1row.nm_depto, w_c1_row.cd_depto,w_c1_row.soma,w_c1_row.media, w_tot_sal, w_tot_med);

    END LOOP;END;

    10. TRATAMENTO DE ERROSEm PL/SQL uma warning ou error condition chamada uma exception. Existem algumas excees j definidas pelo Oracle com minemnicos para referncia. Para as demais, podem ser dados nome pelo usurio, como veremos neste captulo.

    Quando um erro ocorre, uma exception setada, isto , a seqncia de execuo do programa interrompida e o controle transferido para a rea de tratamento de execuo do programa.

    As excees pr-definidas pelo Oracle so setadas quando a condio de erro ocorre. As excees criadas pelo programa devero ser setadas explicitamente pelo verbo RAISE.

    __________________________________________________________________________________________112

  • __________________________________________________________________________________________

    EXCEES PR-DEFINIDAS

    Nome da Exceo Oracle Error SQLCODE Condio de ErroCURSOR_ALREADY_OPEN ORA-06511 -6511 setada se for executado um

    OPEN para um cursor j aberto.DUP_VAL_ON_INDEX ORA-00001 -1 setada se for tentada uma

    incluso de uma coluna com valor duplicado em uma tabela que possui um ndice unique nesta coluna.

    INVALID_CURSOR ORA-01001 -1001 setada se for feita uma operao ilegal com um cursor. Por exemplo: CLOSE em um cursor no aberto.

    INVALID_NUMBER ORA-01722 -1722 setada se algum comando SQL tentou uma converso de uma string para nmero e esta converso falha porque a string no representa um nmero.

    LOGIN_DENIED ORA-01017 -1017 setada se for feita uma tentativa de logon com um username/password invlido.

    NO_DATA_FOUND ORA-01403 +100 setada se num SELECT INTO nenhuma row foi retornada ou se foi feita uma referncia a uma row no inicializada em uma tabela PL/SQL.

    NOT_LOGGED_ON ORA-01012 -1012 setada se uma programa PL/SQL tenata fazer acesso ao database sem efetuar um logon.

    PROGRAM_ERROR ORA-06501 -6501 setada se ocorrer um problema interno.

    STORANGE_ERROR ORA-06500 -6500 setada se PL/SQL sai da memria ou se a memria estiver corrompida.

    TIME_ON_RESOURSE ORA-00051 -51 setada se ocorrer timeout enquanto o ORACLE estiver aguardando por um recurso.

    TOO_MARY_ROWS ORA-014222 -1422 setada se um comando SELECT INTO retormar mais que uma row.

    TRANSACTION_BACKED_OUT

    ORA-00061 -61 setada quando a parte remota de uma transao desmanchada. A transao local deve ser desmanchada tambm.

    VALUE_ERROR ORA-06502 -6502 setada se uma operao aritmtica, converso, constraint error, truncation ocorrer.

    ZERO_DIVIDE ORA-01476 -1476 setada se houver ocorrido uma diviso por zero.

    __________________________________________________________________________________________113

  • __________________________________________________________________________________________

    Ex.:DECLARE

    BEGIN

    SELECT SELECT SELECT

    EXCEPTIONWHEN NO_DATA_FOUND THEN

    END;

    PROBLEMA PROPOSTO: Fazer um programa para crtica dos dados informados atravs de parmetros:

    salrio deve estar entre R$ 1500 e R$ 2000 mensais. Na base gravado o salrio atual. departamento deve existir na tabela de departamentos. grau de instruo deve estar entre 15 e 20. ramal deve iniciar com 2. sexo deve ser F ou M.

    RESOLUO:

    DECLAREw_salario number(7,2) := &1;w-depto char(3) := &2;w_git number(2) := &3;w_ramal number(4) := &4;w_nome char(8) := &5;w_sexo char(1) := &6;e_salario exception;e_salario exception;e_depto exception;e_git exception;e_ramal exception;e_sexo exception;w_aux number(3) := );

    BEGINIF w_salario < 1500 OR w_salario > 2000 THEN

    RAISE e_salario;END IF;select count(*) into w_auxi FROM depto WHERE cd_depto = w_depto;IF w_aux = o THEM

    RAISE e_depto;END IF;IF w_git < 15 OR w_git > 20 THEM

    RAISE e_git;END IF;IF SUBSTR(TO_CHAR (nr_ramal),1,1) 2 THEM

    RAISE e_ramal;END IF;IF w_sexo F' AND w_sexo M THEM

    RAISE e_sexo;END IF;SELECT MAX(cd_mat) INTO w_aux FROM func;INSERT INTO func (cd_mat, vl_sal, cd_depto, nr _ramal, in_sexo, nm _func, nr _git)VALUES (w_aux + 1, w_sal * 12, w_depto, w_ramal, w_sexo. w_func, w_git);EXCEPTION

    WHEN e_sexo THEM

    __________________________________________________________________________________________114

  • __________________________________________________________________________________________

    RAISE_APPLICATION_ERROR (-20001, SEXO INVALIDO);WHEN e_ramal THEM

    RAISE_APPLICATION_ERROR (-20003, GRAU DE INSTRUCAOINVALIDO);

    WHEN e_depto THEMRAISE_APPLICATION_ERROR (-20004, DEPARTAMENTO INVALIDO);

    WHEN e_salario THENRAISE_APPLICATION_ERROR (-20005, SALARIO INVALIDO);

    WHEN OTHERS THENRAISE_APPLICATION_ERROR (-20999, SQLERRM(SQLCODE));

    END;

    EXCEES DEFINIDAS PELOS USURIOS

    A PL/SQL permite que sejam definidas excees de um programa. Este tipo de exceo deve ser setada explicitamente pelo verbo RAISE.

    RAISE

    Seta uma exceo.

    sintaxe: RAISE

    Ex.:DECLARE

    erro_soma EXCEPTION;

    BEGINIF THEN

    RAISE erro_soma;END IF;

    EXCEPTIONWHEN erro_soma THEN

    WHEN OTHERS THEN

    END;

    Obs.: O desvio de execuo do programa transferido para a exceo OTHERS quando o erro ocorrido no foi tratado em outras excees mais especficas. uma opo para diminuio da lista de exceptions.

    PRAGMA EXCEPTION_INIT

    Associa um nome de exceo com um nmero de SQLCODE. Isto permite que se faam testes se erro mais especficos em vez de usar OTHERS.

    sintaxe: PRAGMA EXCEPTION_INIT (,)

    __________________________________________________________________________________________115

  • __________________________________________________________________________________________

    Ex.:

    DECLAREsem_privilegio EXCEPTION;PRAGMA EXCEPTION_INIT (sem_privilegio, -1031); O ORACLE retorna o erro -1031 se, por exemplo, for feita uma tentativa de alterar uma tabela em que o usurio s tem autorizao de SELECT.

    BEGIN

    EXCEPTIONWHEN sem_privilegio THEN

    END;

    RAISE_APPLICATION_ERROR

    uma procedure que permite ao usurio enviar mensagens de um subprograma ou database trigger.

    sintaxe: RAISE_APPLICATION_ERROR (,);

    Ex.:

    CREATE TRIGGER checa_salarioDECLAREBEGIN

    IF (:new.vl_sal salrio_maximo)THEN

    RAISE_APPLICATION_ERROR (-20225, Salrio fora de faixa);

    END IF;END;

    Obs.: deve variar de -20000 a -20999 e a deve possuir at 512 bytes de comprimento.

    PROPAGAO DA EXCEO

    Quando uma exceo setada, se PL/SQL no encontrar um tratamento para ela no bloco correto ou subprograma, a exceo se propaga. Isto , a exceo se reproduz no bloco externo e assim por diante at que a PL/SQL retorne um erro para o ambiente (abortando o programa).

    Ex.:BEGIN

    BEGIN

    IF x = 1 THEN RAISE A;ELSIF x = 2 THEN RAISE B;ELSE RAISE C;END IF;

    EXCEPTIONWHEN A THEN

    END;

    __________________________________________________________________________________________116

  • __________________________________________________________________________________________

    AEXCEPTION

    WHEN B THEN

    END;

    A exceo A tratada no bloco mais interno. Aps seu tratamento o programa continua no comando A.

    A exceo B se propaga para o bloco mais externo, tratada e o programa termina normalmente.

    A exceo COMANDO SQL: se propaga para o bloco mais externo, no e tratada e o erro passa para o ambiente, isto , o programa abortado.

    SQLERRM

    String procedure para traduzir um SQLCODE.

    sintaxe: SQLERRM ()

    Ex.:

    DECLAREmsg CHAR(100)

    BEGINFOR num IN 1..9999 LOOP

    msg := SQLERRM (num * -1);INSERT INTO tab_erro VALUES (msg);

    END LOOP;END;

    11. SUBPROGRAMAS Subprogramas so blocos PL/SQL com nome, que podem receber parmetros e ser invocados. A PL/SQL possui dois tipos de subprogramas chamados procedures e funes. Geralmente usa-se uma procedure para executar uma ao e uma funo para calcular um valor.

    Da mesma forma que qualquer outro bloco (annimo) PL/SQL, os subprogramas possuem uma parte declarativa, uma parte executvel e uma parte opcional para tratamento de exceo.

    Os subprogramas podem ser definidos em qualquer ferramenta ORACLE que suporte PL/SQL. Podem ser declaradas dentro de blocos, procedures, funes e packages. Os subprogramas devem ser declarados no fim da parte declarativa, aps todos os outros objetos do programa.

    Ex.:DECLARE

    w_vl_lim NUMBER(15,2) := &1;PROCEDURE calc_ir (val_sal IN NUMBER, val_ir OUT NUMBER) IS BEGIN

    END calc_ir;FUNCTION calc_inss (val_sal IN NUMBER, val_lim IN NUMBER)

    RETURN NUMBER ISval_inss NUMBER(15,2);BEGIN

    __________________________________________________________________________________________117

  • __________________________________________________________________________________________

    BEGIN

    END;PROCEDURES

    As procedures so subprogramas que executam uma ao especfica.

    sintaxe: PROCEDURE [([,,])] ISBEGIN

    [EXCEPTION

    ]END ];

    onde: parmetro possui a seguinte sintaxe:

    [IN | OUT |IN OUT] [{:= | DEFAULT} ]

    Quando [IN | OUT ] no for especificado, ser assumido IN.

    Ex:

    PROCEDURE calc_ir (val_sal IN NUMBER, val_ir OUT NUMBER) ISBEGIN

    IF val_sal < 300.00THEN

    val_ir := 0;ELSIF val_sal BETWENN 300.01 AND 1000.00THEN

    val_ir := val_sal * .10;ELSIF val_sal BETWEEN 1000.01 AND 3000.00THEN

    val_ir := val_sal *.20;ELSE

    val_ir := val_sal *.30;END calc_ir;

    FUNCTIONS

    Uma funo um subprograma que calcula um valor. Funes e procedures so estruturalmente iguais, exceto que as funes possuem uma clusula RETURN que especifica o tipo de retorno da funo.

    sintaxe: FUNCTION [([,,])]RETURN IS[]

    BEGIN

    [EXCEPTION]

    END ];

    onde: parmetros possui a seguinte sintaxe:

    [IN | OUT | IN OUT] [{:=| DEFAULT} ]

    Quando [IN | OUT ] no for especificado, ser assumido IN.

    __________________________________________________________________________________________118

  • __________________________________________________________________________________________

    Ex.:

    FUNCTION calc_inss (val_sal IN NUMBER, val_lim IN NUMBER)RETURN NUMBER IS

    val_inss NUMBER(15,2);BEGIN

    val_inss := val_sal * .08;IF val_inss > val_limTHEN

    val_inss := val_lim;END IF;RETURN val_inss;

    END calc_inss;

    DECLARAES FORWARD

    A PL/SQL exige que se declare um subprograma antes de chama-lo. No caso de recursividade, porm isto no possvel. A PL/SQL resolve este problema com uma declarao forward. Esta declarao pode ser usada para:

    definir subprogramas em ordem alfabtica

    definir subprogramas recursivos

    grupar subprogramas dentro de packages

    Uma declarao forward consiste de uma declarao de subprograma terminada por um ;.

    Ex:

    DECLAREw_vl_lim NUMBER(15,2) := &1;PROCEDURE calc_ir(val_sal IN NUMBER, val_ir OUT NUMBER); declarao

    forwardFUNCTION calc_inss (val_sal IN NUMBER, val_lim IN NUMBER)

    RETURN NUMBER ISval_inss NUMBER(15,2);BEGIN

    RETURN val_inss;

    END calc_inss;PROCEDURE calc_ir (val_sal IN NUMBER, val_ir OUT NUMBER) IS BEGIN

    END calc_ir;

    BEGIN

    END;

    __________________________________________________________________________________________119

  • __________________________________________________________________________________________

    STORED SUBPROGRAMS

    No ORACLE possvel armazenar um subprograma PL/SQL na base da dados aps a compilao. Vrias vantagens so adquiridas com este procedimento, tais como:

    Produtividade Vrios programas podem fazer rotinas previamente gravadas na base de dados, diminuindo a redundncia de codificao.

    Performance Subprogramas podem reduzir a necessidade de calls nas aplicaes. Por exemplo, para executar 10 comandos SQL individuais, 10 calls so necessrias, porm para executar um subprograma contendo dez comandos SQL, apenas um call necessrio.

    Memria Subprogramas rem a vantagem de compartilhar memria. Ou seja, somente uma cpia de um subprograma necessita ser carregado na memria para execuo por mltiplos usurios.

    Integridade A utilizao de librarys diminui a possibilidade de erros na codificao de rotinas de consistncia, uma vez que s h a necessidade de se efetuar a validao da rotina uma vez e ela poder ser usada por qualquer nmero de aplicaes.

    Segurana Pode haver um aumento na segurana, uma vez que o DBA pode restringir o acesso a determinadas operaes, fornecendo autorizao somente atravs de subprogramas.

    CHAMADAS DE UM STORED PROGRAM

    Local Sintaxe:De outro subprograma

    ();

    De um programa de aplicao (HOST)

    EXEC SQL EXECUTEBEGIN (

  • __________________________________________________________________________________________

    12. DATABASE TRIGGERSUm DATABASE TRIGGER um programa PL/SQL armazenado em um banco ORACLE, associado com uma tabela especfica. O ORACLE ir disparar a execuo do DATABASE TRIGGER automaticamente quando uma determinada operao SQL afeta a tabela.

    Deste forma, pode-se usar um DATABASE TRIGGER para:

    Logar modificaes

    garantir crticas complexas

    Gerar o valor de colunas

    Implementar nveis de segurana mais complexos

    Manter tabelas duplicadas

    Pode-se associar at 12 DATABASE TRIGGERS a cada tabela, um de cada tipo (BEFORE UPDATE , BEFORE DELETE , BEFORE INSERT , BEFORE INSERT , BEFORE UPDATE , BEFORE DELETE e as mesmas sintaxes para AFTER). Um DATABASE TRIGGER composto de 3 partes:

    evento

    constraint (opcional)

    ao

    Quando o evento ocorre, o trigger disparado e um bloco PL/SQL annimo executa a ao.

    Deve-se observar que os DATABASE TRIGGERS executam com os privilgios do OWNER e no do usurio corrente.

    sintaxe: CREATE [OR REPLACE] TRIGGER {BEFORE | AFTER}{DELETE | INSERT | UPDATE [OF [,]

    [OR DELETE | INSERT | UPDATE [OF [,]}ON [REFERENCING {OLD [AS] | NEW [AS]

    [OLD [AS] | NEW [AS] ]}FOR EACH ROW [WHEN ()]]

    __________________________________________________________________________________________121

  • __________________________________________________________________________________________

    Ex.:

    CREATE TRIGGER checa_salarioBEFORE UPDATE OF vl_sal, nr_git ON FUNCFOR EACH ROW WHEN (NEW.nr_git < 56)DECLARE

    salario_minimo NUMBER(5) := 0;salario_maximo NUMBER(5) := 0;faixa EXCEPTION;negativo EXCEPTION;excede EXCEPTION;

    BEGINSELECT MIN(vl_sal), MAX(vl_sal)

    INTO salario-minimo, salario_maximoFROM folha

    WHERE nr_git = :new.nr_git;IF (:NEW.vl_sal < salario_minimo OR

    :NEW.vl_sal > salario_maximo)THEN

    RAISE faixaELSIF (:NEW.vl_sal < OLD.vl_sal)THEN

    RAISE negativo;ELSIF (:New.vl_sal > 1.1 * :OLD.vl_sal)THEN

    RAISE excede;END IF;

    EXCEPTIONWHEN faixa THEN

    RAISE_APPLICATION_ERROR(-20225, Salrio fora da faixa);WHEN negativo THEN

    RAISE_APPLICATION_ERROR(-20230, Incremento negativo);WHEN excede THEN

    RAISE_APPLICATION_ERROR(-20235, Incremento excede 10%);WHEN OTHERS THEN

    RAISE_APPLICATION_ERROR(-20999, SQLERRM(SQLCODE));END;

    __________________________________________________________________________________________122

  • __________________________________________________________________________________________

    13. PACKAGESUm package um objeto que grupa logicamente subprogramas, objetos e tipos PL/SQL. Packages so compostos de duas partes: A especificao e o corpo do pacote. A especificao a interface com as aplicaes. Nela so declarados os tipos, variveis, constantes, excees, cursores e subprogramas. No corpo do pacote concluda a definio dos cursores e subprogramas e feita a implementao da especificao.

    Um package no pode ser chamado, receber parmetro nem ser aninhado (declarado dentro de outro package).

    sintaxe: PACKAGE IS parte da especificao

    END [];

    PACKAGE BODY IS corpo do pacote

    [BEGIN]

    END [];

    A parte de especificao so declaraes pblicas, visveis pelas aplicaes. O corpo implementa detalhes e declaraes privadas que so invisveis pelas aplicaes. O corpo seria uma caixa preta.

    CRIANDO UM PACKAGE

    Um pacote pode ser criado internamente no SQL*PLUS ou no SQL*DBA usando-se os comandos CREATE PACKAGE e CREATE PACKAGE BODY.

    sintaxe: CREATE [OR REPLACE]PACKAGE AS/IS

    END

    CREATE [OR REPLACE]PACKAGE BODY AS/IS

  • __________________________________________________________________________________________

    Ex:CREATE PACKAGE funcionario AS

    TYPE func_reg_type IS RECORD )cd_depto_mat NUMBER, vl_sal NUMBER);CURSOR salario (mat NUMBER) RETURN func_reg_type;

    PROCEDURE admisso(nome CHAR, grau NUMBER, sal NUMBER, depto CHAR);

    PROCEDURE demisso (mat NUMBER);END funcionario;

    CREATE PACKAGE BODY funcionario AsCURSOR salario (mat NUMBER) RETURN func_reg_type IS

    SELECT cd_mat, vl_sal FROM funcWHERE cd_mat = matORDER BY vl_sal DESC;

    PROCEDURE admisso(nome CHAR, grau NUMBER, sal NUMBER, depto CHAR) IS

    BEGININSERT INTO func

    (nm_func, nr_git, vl_sal, cd_mat, cd_depto)VALUES(nome, grau, sal, cd_mat_seq.NEXTVAL, depto);

    END admisso;

    PROCEDURE demisso (mat NUMBER) ISBEGIN

    DELETE FROM func WHERE cd_mat = mat;END demisso;

    END funcinario;

    Deve-se observar que somente a especificao do pacote visvel e acessvel pela aplicao. Detalhes da implementao que se localizam do body so invisveis e inacessveis. Desta forma pode-se alterar o body sem haver necessidade de se recompilar os programas que usarem os packages

    VANTAGENS DO USO DE PACKAGES

    Packages oferecem vrias vantagens:

    Modularidade Packages permitem que se encapsule logicamente tipos, objetos e subprogramas relacionados.

    Desenho da aplicao quando uma aplicao desenhada, tudo que necessrio inicialmente a informao da especificao do package. Pode se codificar e compilar a especificao sem o corpo do package. Uma vez que armazenado a referncia ao pacote pode ser compilada tambm.

    Segurana Com pacotes pode-se especificar que tipos, objetos e subprogramas so pblicos ou privados. Os pblicos so especificados na parte de especificao dos packages. J os privados so totalmente especificados do body do package. Eles so usados dentro do prprio pacote e no precisam ficar visveis a quem usar os pacotes.

    Funcionalidade Variveis pblicas e cursores empacotados podem ser compartilhados por todas as procedures que executarem no ambiente.

    Performance Quando feita a primeira chamada de um package subprogram pela primeira vez, todo o pacote carregado na memria. Assim, subsequentes chamadas a outros subprogramas dentro do pacote no requerem I/O de disco

    __________________________________________________________________________________________124

  • __________________________________________________________________________________________

    REFERNCIAS A PACKAGES

    Para fazer uma referncia aos tipos, objetos e subprogramas declaradas dentro da especificao de packages deve-se usar a seguinte notao:

    . . .

    Pode-se fazer referncia a pacotes de dentro de database triggers, stored subprograms e blocos PL/SQL dentro de programas e blocos PL/SQL annimos.

    A inicializao da parte executvel do package feita uma nica vez, na primeira vez que for feita referncia ao package (por sesso).

    14. MENSAGENS EM STORED PROCEDURES E TRIGGERSPodemos enviar mensagens a partir de procedures ou packags usando package DBMS_OUTPUT. Este package possui duas procedures PUT e PUT_LINE, que faro com que a mensagem seja armazenada em um buffer que pode ser mostrado quando o trigger, procedure ou package for executado.

    Estas mensagens podero ser mostradas com o uso da procedure GET_LINE ou com o uso do comando SET SERVER OUTPUT ON no SQL*PLUS ou SQL*DBA, caso contrrio estas mensagens sero ignoradas.

    Este package pode ser especialmente til para depurao.

    EXEMPLOSuponha que desejssemos depurar um trigger. Neste caso devemos incluir uma ou mais linhas de mensagens, da seguinte forma:

    DBMS_OUTPUT.PUT_LINE (O novo valor ||:new.col);

    Devemos usar o SQL*PLUS ou SQL*DBA com a opo SERVER UOTPUT setada para ON, para executar o trigger e depurar as mensagens includas.

    PROCEDURES E FUNES

    Veremos, agora cada uma das procedures e funes contidas no package DBMS_OUTPUT:

    DISABLE PROCEDURE

    Esta procedure desabilita as chamadas para PUT, PUT_LINE, NEW_LINE, GET_LINE e GET_LINES e limpa o buffer.

    Esta rotina no necessria se estivermos usando a opo SERVER UOTPUT no SQL*PLUS ou SQL*DBA.

    sintaxe: DISABLE;

    __________________________________________________________________________________________125

  • __________________________________________________________________________________________

    ENABLE PROCEDURE

    Esta procedure habilita chamadas para PUT, PUT_LINE, NEW_LINE, GET_LINE e GET_LINES. As chamadas a estas procedures so ignoradas se o package DBMS_OUTPUT no estiver habilitado.

    Deve-se especificar a quantidade de informao (em bytes) as ser armazenada no buffer. Se o buffer for excedido, receberemos a seguinte mensagem de erro:

    -20000, ORU-10027: buffer overflow, limit of buffer_limit bytes.

    So permitidas mltiplas chamadas ENABLE. No necessria a chamda a esta procedure quando utilizamos a opo SQL*DBA ou SQL*PLUS. Se existirem mltiplas chamadas a esta procedure, o maior valor dentre os especificados. O tamanho mximo 1.000.000 e o mnimo 2.000 bytes.

    sintaxe: ENABLE (buffer_size in integer);

    GET_LINE PROCEDURE

    Esta procedure recupera uma linha da informao do buffer, excluindo o caracter newline final. O tamanho mximo da linha 255 bytes.

    Todas as linhas no recuperadas sero descartadas quando usadas as procedures PUT, PUT_LINE ou NEW_LINE.

    Se a procedure concluir com sucesso, o status retornado zero, caso contrrio 1 (no existem linhas no buffer).

    sintaxe: GET_LINE(line out varchar2, status out integer);

    GET_LINES PROCEDURE

    Esta procedure recupera um array de linhas e pode ser usada no lugar de GET_LINE para reduzir o nmero de chamadas ao servidor. Devemos especificar o nmero de linhas que desejamos recuperar do buffer. Aps recuperar o nmero de linhas especificado, a procedure retorna o nmero de linhas realmente recuperado. Se este nmero for menor que o nmero de linhas requisitado, significa que no existem mais linhas no buffer.Todas as linhas no recuperadas sero descartadas quando usadas as procedures PUT, PU_LINR ou NEW_LINE.Cada linha no array pode ter at 255 bytes de comprimento.

    Sntaxe: GET_LINES (lines out chararr, numlines in out integer);

    NEW_LINE PROCEDURE

    Esta procedure coloca uma marca de fim da linha no buffer. Normalmente usamos esta procedure aps uma ou mais chamadas procedure PUT, para indicar fim de mensagem. Cada chamada a NEW_LINE gerar uma linha a ser retornada pelo GET_LINE.

    sintaxe: NEW_LINE;

    __________________________________________________________________________________________126

  • __________________________________________________________________________________________

    PUT PROCEDURE

    Esta procedure especifica a informao que desejamos armazenar no buffer. Devemos usar esta procedure para adicionar pedaos de informao ao buffer. As procedures GET_LINE e GET_LINES no retornam uma linha que no tenham sido terminadas com o caracter newline. Se o tamanho especificado pelo buffer for excedido, ser recebido uma mensagem de erro.

    Sintaxe: PUT (item varchar2 | number | date);

    Obs.: Se passarmos como parmetro um number ou date, quando o item for recuperado ser convertido (com TO_CHAR) para string no formato default. Se desejarmos um formato particular, devemos passar o parmetro j convertido (VARCHAR2).

    PUT_LINE

    Esta procedure especifica a informao que desejamos armazenar no buffer. Esta procedure armazena, automaticamente, um caracter de fim de linha a cada texto enviado. Cada chamada a PUT_LINE gera uma linha a ser recuperada pela procedure GET_LINE.

    EXEMPLO

    O package DBMS_OUTPUT , normalmente, usado para depurao de stored procedures e tringgers, como veremos no exemplo abaixo:

    CREATE FUNCTION depto_sal (p_cd_depto IN CHAR) RETURN NUMBER IS CURSOR func_cursor IS

    SELECT vl_sal FROM func WHERE cd_depto = p_cd_depto;v_total_sal NUMBER(11,2) := 0;v_conta NUMBER(10) := 1;func_rec func_cursor%ROWTYPE;BEGIN

    FOR func_rec IN func_cursor LOOPv_total_sal := v_total_sal + func_rec.vl_sal;PUT_LINE (loop NO. = || TO_CHARY(v_conta) || ; salrio = || TO_CHAR(v_conta_sal));v_conta := v_conta + 1;

    END LOOP;PUT_LINE (Total de salrios = || TO_CHAR(v_total_sal));RETURN v_total_sal;

    END depto_sal;

    __________________________________________________________________________________________127

    1. Conceito2. Estrutura3. Arquitetura4. COMPONENTES DA LINGUAGEM5. DECLARAES6. ATRIBUIES7. FUNES PR-DEFINIDAS8. COMANDOS9. COMUNICAO COM O SQL10. TRATAMENTO DE ERROS11. SUBPROGRAMAS 12. DATABASE TRIGGERS13. PACKAGES14. MENSAGENS EM STORED PROCEDURES E TRIGGERS