48665348-pl-sql
DESCRIPTION
48665348-PL-SQLTRANSCRIPT
-
__________________________________________________________________________________________
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