__________________________________________________________________________________________

Í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

__________________________________________________________________________________________

__________________________________________________________________________________________
INSTR.........................................................................................................................95
LENGTH.....................................................................................................................96
LOWER.......................................................................................................................96
LPAD..........................................................................................................................96
LTRIM.........................................................................................................................96
REPLACE...................................................................................................................96
RPAD..........................................................................................................................96
RTRIM........................................................................................................................96
SOUNDEX..................................................................................................................97
SUBSTR.....................................................................................................................97
TRANSLATE...............................................................................................................97
UPPER.......................................................................................................................97
DATAS....................................................................................................................................97
ADD_MONTHS...........................................................................................................97
LAST_DAY.................................................................................................................97
MONTHS_BETWEEN.................................................................................................97
NEW_TIME.................................................................................................................98
NEXT_DAY.................................................................................................................98
SYSDATE...................................................................................................................98
ROUND.......................................................................................................................98
TRUNC.......................................................................................................................98
CONVERSÃO.........................................................................................................................99
CHARTOROWID........................................................................................................99
HEXTORAW...............................................................................................................99
RAWTOHEX...............................................................................................................99
ROWIDTOCHAR........................................................................................................99
TO_CHAR...................................................................................................................99
MISCELÂNEA.......................................................................................................................100
DECLARE.................................................................................................................100
GREATEST..............................................................................................................101
LEAST......................................................................................................................101
NVL...........................................................................................................................101
UID...........................................................................................................................101
USER........................................................................................................................101
USERENV................................................................................................................101
VSIZE.......................................................................................................................101
PROBLEMA PROPOSTO: .......................................................................................102
Resolução..................................................................................................................102

8. COMANDOS................................................................................................................................103
LABELS................................................................................................................................103
EXIT.......................................................................................................................................103
IF THEN ELSE......................................................................................................................104
LOOP....................................................................................................................................105
PROBLEMA PROPOSTO: .......................................................................................106
RESOLUÇÃO.............................................................................................................106

WHILE LOOP........................................................................................................................107
PROBLEMA PROPOSTO: .......................................................................................107
RESOLUÇÃO:............................................................................................................107

FOR LOOP............................................................................................................................108
GOTO....................................................................................................................................109
NULL.....................................................................................................................................109
PROBLEMA PROPOSTO: .......................................................................................109
RESOLUÇÃO:............................................................................................................110

9. COMUNICAÇÃO COM O SQL.................................................................................................110
OPEN CURSOR ...................................................................................................................110
CURSOR LOOP....................................................................................................................111
PROBLEMA PROPOSTO:........................................................................................111
RESOLUÇÃO:............................................................................................................112

10. TRATAMENTO DE ERROS....................................................................................................112
EXCEÇÕES PRÉ-DEFINIDAS..............................................................................................113
__________________________________________________________________________________________

__________________________________________________________________________________________
PROBLEMA PROPOSTO: .......................................................................................114
RESOLUÇÃO:............................................................................................................114

EXCEÇÕES DEFINIDAS PELOS USUÁRIOS.....................................................................115
RAISE.......................................................................................................................115
PRAGMA EXCEPTION_INIT....................................................................................115
RAISE_APPLICATION_ERROR..............................................................................116
PROPAGAÇÃO DA EXCEÇÃO................................................................................116
SQLERRM................................................................................................................117

11. SUBPROGRAMAS ...................................................................................................................117
PROCEDURES.....................................................................................................................118
DECLARAÇÕES FORWARD...............................................................................................119
STORED SUBPROGRAMS..................................................................................................120
CHAMADAS DE UM STORED PROGRAM..............................................................120
CRIANDO UM STORED SUBPROGRAM................................................................120

12. DATABASE TRIGGERS..........................................................................................................121
13. PACKAGES................................................................................................................................123
CRIANDO UM PACKAGE....................................................................................................123
VANTAGENS DO USO DE PACKAGES..............................................................................124
REFERÊNCIAS A packageS................................................................................................125

14. MENSAGENS EM STORED PROCEDURES E TRIGGERS...............................................125
EXEMPLO.............................................................................................................................125
Procedures e Funções........................................................................................................125
DISABLE PROCEDURE...........................................................................................125
ENABLE PROCEDURE............................................................................................126
GET_LINE PROCEDURE.........................................................................................126
GET_LINES PROCEDURE......................................................................................126
NEW_LINE PROCEDURE .......................................................................................126
PUT PROCEDURE ..................................................................................................127
PUT_LINE.................................................................................................................127
EXEMPLO................................................................................................................127

__________________________________________________________________________________________

__________________________________________________________________________________________

GUIA DE REFERENCIA DE PL/SQL COM BASE ORACLE
1. CONCEITO
A PL/SQL é uma linguagem procedural do ORACLE, extensão ao SQL. Este capítulo da apostila tem
o objetivo de dar uma visão geral da linguagem e suas potencialidades. Através de exemplos simples
veremos a aplicabilidade da linguagem. No fim do capítulo estão 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 variáveis,
definir subprogramas (procedures ou funções) e controlar erros de execução.

2. ESTRUTURA
A PL/SQL é uma estrutura em blocos, ou seja, as unidades básicas (procedures, funções, etc.)
podem conter qualquer número de sub-blocos. Um bloco permite que se façam declarações
associadas ao bloco e que deixam de existir quando o bloco termina.
Cada bloco é composto basicamente de 3 partes:
DECLARE
<declarações> ______________ opcional
BEGIN
<lógica> ___________________ obrigatória
EXCEPTION
<erros> _____________ opcional
END;
A ordem das partes é lógica, ou seja, primeiro deve-se efetuar as declarações, para depois utilizar (na
lógica) as variáveis criadas. As exceções ocorridas durante a execução podem ser resolvidas na
parte referente a erros.
Exemplo:
DECLARE
w_salario
NUMBER(5);
BEGIN
SELECT vl_sal INTO w_salario FROM func
WHERE cd_mat = 150
FOR UPDATE OF;
IF w_salario < 800
THEN
UPDATE func
SET salario = w_salario * 1.3
WHERE cd_mat = 150;
ELSE
UPDATE func
SET vl_sal = w_salario * 1.15
WHERE cd_mat = 150;
END IF;
COMMIT;
END;

__________________________________________________________________________________________
81

__________________________________________________________________________________________

3. ARQUITETURA
O módulo executável 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) são
independentes. No ambiente instalado, a PL/SQL aceita como entrada qualquer bloco ou
subprograma escrito na linguagem. Quando a instalação é feita no RDBMS, é possível a inclusão de
rotinas em PL/SQL nos aplicativos das host languages. É possível ainda, a compilação separada de
subprogramas e armazenamento na base de dados ORACLE, que serão lidos a tempo de execução.
Um Subprograma explicitamente criado usando uma ferramenta do ORACLE é chamado de “stored
subprogram”, que uma vez compilado e armazenado no dicionário de dados, poderá ser chamado por
qualquer número de aplicações conectadas à base de dados.
Ex.: no SQL *PLUS
SQL> execute teste (‘DILSON’)

4. COMPONENTES DA LINGUAGEM
IDENTIFICADORES
Consiste de uma letra opcionalmente seguida de números, “$”, ”_” ou “#”. As letras podem ser
minúsculas ou maiúsculas.
Ex.:

Legais
money$$$tree
ab###
novo_teste_

Ilegais
teste&teste
cd_depto
nmfunc

PALAVRAS RESERVADAS
Palavras que possuam um significado especial para a SQL.
Ex.:

BEGIN
END

LITERAIS
É uma representação explícita
identificador.
Ex.:
Numéricos
030
6
-14
+32767
12.0
.5
‘2E5
-9.5E-3

de um número, caracter, string ou boleano, não representado por um
Caracteres
‘Z’
‘%’
‘7’
‘.‘
‘.‘
‘z’
‘(‘

Strings
‘10-NOV-91’
‘hello,world’

Boleanos
TRUE
FALSE

__________________________________________________________________________________________
82

Para comentários que ultrapassem uma linha.<escala>) ] subtipos: dec decimal double precision float integer int numeric real smallint idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number • CHAR alfanumérico de tamanho fixo com até 32767 caracteres.1 sintaxe: binary_integer subtipos: natural positive -de 0 a (2**31) -1 -de 1 a (2**31) -1 • NUMBER numérico. restrições e intervalo de valores. O restante da linha é considerado comentário. que indiquem um subconjunto de valores. sintaxe: number [ (<precisão>. sintaxe: long __________________________________________________________________________________________ 83 . O dado pode ser simples ou composto. Ex. DECLARAÇÕES TIPOS DE VARIAVEIS Cada constante ou variável possui um tipo que especifica o formato de armazenamento.: SELECT vl_sal INTO w_salario – obtêm o salário atual /* calculo da bonificação */ IF w_salario > 50000 5. pode-se usar a notação /* (inicio) e */(fim). sintaxe: char [ (<comprimento>) ] subtipo: string idem a char • LONG alfanumérico de tamanho variável com comprimento de até 32760. • SUBTIPOS – São associados aos tipos com uma restrição. para armazenamento de valores inteiros de -2**31 a (2**31) . para armazenamento de valores em ponto flutuante com precisão de até 38 dígitos.__________________________________________________________________________________________ COMENTÁRIOS: O início do comentário é marcado por dois hífens em qualquer ponto da linha. VARIÁVEIS SIMPLES • BINARY INTEGER numérico.

row dentro do bloco ( primeira row é 0) FFFF . constante ou coluna do database. sintaxe: varchar2 [(<comprimento>) ] subtipo: varchar idem a varchar2 • RAW para armazenamento de dados binários (tam.: DECLARE W_CODIGO NUMBER(3) W_CODIGO2 W_CODIGO%TYPE.número do arquivo (database file) ATRIBUTOS ESPECIAIS As variáveis PL/SQL e constantes possuem atributos. • %TYPE este atributo copia os atributos de uma variável. que são propriedades que permitem a referência ao tipo e estrutura do objeto sem necessidade de repetição de sua definição.__________________________________________________________________________________________ • VARCHAR2 alfanumérico de tamanho variável com comprimento de até 32767. ou null).máx. sintaxe: raw (<comprimento>) • LONG RAW para armazenamento de dados binários até o tamanho de 32760. false. sintaxe: <variável>/<constante>/<coluna>%TYPE Ex.RRRR. que podemos usar para facilitar a manutenção. É particularmente usado quando declaramos variáveis que pertençam as colunas do database. • DATE armazenamento de datas. sintaxe: rowid formato: BBBBBBBBB.variável de tipo idêntico a código W_COD_DEP DEPTO. . As tabelas e colunas do database possuem atributos similares. sintaxe: long raw • BOOLEAN valores boleanos (true.FFFF onde: BBBBBBBBB .CD_DEPTO%TYPE /* variável de tipo idêntico à variável da base de dados cd_depto */ __________________________________________________________________________________________ 84 . até 32767). sintaxe: date • ROWID valores de “rowid”do Oracle (em hexadecimal).bloco dentro do arquivo (database file) RRRR .

NM_DEPTO FROM DEPTO.contém todos os dados lidos FROM . CLOSE w_c1. .cursor com apenas 2 colunas . CURSOR W_C1 Ls SELECT CD_DEPTO. W_C1_ROW WC1%ROWTYPE. EXIT WHEN w_c1%NOTFOUND. O registro pode armazenar uma linha de dados selecionados da tabela ou recebidos de um cursor (fetched). RESOLUÇÃO 1: DECLARE w_reg_func FUNC%ROWTYPE. trunc(w_reg_func.da linha da tabela .nr_git * w_reg_func. END. sintaxe: <tabela>/<cursor>%ROWTYPE Ex.nr_cargo)).CD_DEPTO = ‘Á00’ . Deseja-se preenchê-la a partir da tabela funcionário.colunas da tabela . LOOP FETCH w_c1 INTO w_reg_func. IF W_DEP_ROW. __________________________________________________________________________________________ 85 .valor) VALUES (w_reg_func.cd_mat. W_MAT NUMBER(3). com a matrícula do funcionário (ordem) e a expressão trunc(nr_git*vl_sal/nr_cargo) na coluna valor.a referência a cada campo é THEN . BEGIN OPEN w_c1. INSERT INTO resultado (ordem. ORDEM N(5)).possui as mesmas colunas de W_C1 BEGIN SELECT * INTO W_DEP_ROW FROM depto WHERE cd_mat = W_MAT. ENDLOOP.vl_sal / w_reg_func.__________________________________________________________________________________________ • %ROWTYPE este atributo gera um tipo de registro que representa uma linha da tabela. CURSOR w_c1 lS SELECT * FROM func ORDER BY cd_mat.variável do tipo row .: DECLARE W_DEP_ROW DEPTO%ROWTYPE.feita com o uso da variável de tipo ROWTYPE PROBLEMA PROPOSTO Suponhamos a existência de uma tabela (RESULTADO) com o layout (VALOR N (30).

w_reg_func w_c1%ROWTYPE. END VARIÁVEIS COMPOSTAS • TABLE .<coluna>%TYPE} [NOT NULLl] INDEX BY BINARY_INETGER Ex... BEGIN OPEN w_c1. • RECORD . sintaxe: TYPE <nome> IS RECORD (<campo1>{<tipo campo>/<tabela>.tabelas na PL/SQL podem ter somente uma coluna e uma primary key. teste TAB.nr_git * w_reg_func. nr_cargo FROM func. trunc(w_reg_func.: DECLARE TYPE tab IS TABLE OF char(10) INDEX BY BINARY_INTEGER. Deve ser feita uma declaração de variável com o tipo criado posteriormente para uso. INSERT INTO resultado (ordem.) __________________________________________________________________________________________ 86 . teste (1) := ’1234567890’. nenhuma das quais nomeadas. vl_sal.cd_mat. EXIT WHEN w_c1%NOTFOUND. nr_git.vl_sal / w_reg_func.nr_cargo)).__________________________________________________________________________________________ RESOLUÇÃO 2 DECLARE CURSOR w_c1 lS SELECT cd_mat. END LOOP. sintaxe: TYPE <nome> IS TABLE OF {<tipo coluna> / <tabela>. teste (-1) := ‘-1234567890’. LOOP FETCH w_c1 INTO w_reg_func. A declaração cria um tipo de variável. <campo2>{<tipo campo>/<tabela>. CLOSE w_c1.Permite a criação de um item estruturado.<coluna>%TYPE}[NOT NULL] .valor) VALUES (w_reg_func.<coluna>%TYPE}[NOT NULL].

nome DEPTO.__________________________________________________________________________________________ Ex... REG_TESTE. REGISTRO. outro_reg reg_teste REGISTRO. teste. teste.. teste REGISTRO.a1 (2) := ‘bb’.DEPTO := ‘A00’. .a1 (1) := ‘aa’... SELECT cd_depto. a2 CHAR(1)).: DECLARE TYPE tab is table of CHAR(2) INDEX BY BINARY_INTEGER... Ex.: DECLARE TYPE registro IS RECORD (depto CHAR(03) NOT NULL... NM_DEPTO%TYPE). nm_depto INTO outro_reg FROM DEPTO WHERE cd_depto = ‘D11’. TYPE registro IS RECORD (a1 TAB. BEGIN teste..a1 (3) := ‘cc’. __________________________________________________________________________________________ 87 .

FOR i IN 1.cd_depto GROUP BY func. cargo T_CARGO. texto. nr_cargo. w_c1_row w_c1%ROWTYPE. qtd) VALUES (w_c1_row. sintaxe: <nome da constante> CONSTANTE<tipo> :=/DEFAULT <valor inicial>.cd_depto = depto. associar um valor inicial. cargo(1) := ‘OPERADOR’ cod_cargo(2) := 43. O nome do cargo deve ser apresentado no resultado.cd_depto. Seu valor não poderá ser alterado durante o programa. EXIT.cd_depto.w_c1_row.cd_depto. .14159. a quantidade de funcionários por departamento.__________________________________________________________________________________________ PROBLEMA PROPOSTO Deseja-se saber. nr_cargo. depto WHERE func. nm_depto. BEGIN cod_cargo(1) := 42. END LOOP.nr_cargo)ll’ ‘ll cargo(i). nm_depto. RESOLUÇÃO: DECLARE TYPE t_cargo IS TABLE OF char(25) INDEX BY BINARY_INTEGER.12 LOOP IF cod_cargo(i) =w_c1_row. TYPE t_codigo IS TABLE OF number(3) INDEX BY BINARY_INTEGER. . imediatamente. LOOP FETCH w_c1 INTO w_c1_row. cod_cargo T_CODIGO. to_char(w_c1_row. count(*) conta FROM func. CONSTANTES A declaração de uma constante é semelhante à declaração de uma variável. END IF. EXIT WHEN w_c1%NOTFOUND. CURSOR w_c1 IS SELECT func.14159. para cada cargo. exceto que devemos adicionar a palavra chave CONSTANT e. END.. cargo(2) := ‘DIGITADOR’ . CONSTANT REAL DEFAULT := 3. Ex.conta). __________________________________________________________________________________________ 88 .: DECLARE W_TESTE W_TESTE1 CONSTANT REAL := 3.nr_cargo THEN INSERT INTO saida (valor. OPEN w_c1. END LOOP.

variável tipo row .: DECLARE erro_matrícula • EXCEPTION. END VARIÁVEIS ESPECIAIS • EXCEPTION .cd_DEPTO = ‘A00’ THEN W_CONTADOR := WHERE_CONTADOR + 1.variável c/ restrição .variável de tipo idêntico a código . W_CODIGO%TYPE := ‘B01’ DEPTO. CURSOR . CHAR(O3)NOT NULL := ‘A00’ CONSTANT REAL := 3.variável iniciada com zero ./* constante de tipo real .cursor c/ 2 colunas da tabela . Isto ocorre quando usamos variável de um tipo onde era esperado outro. IF W_DEP_ROW.declara um cursor. W_C1_ROW W_C1%ROWTYPE .__________________________________________________________________________________________ CONVERSÃO DE TIPO DE VARIÁVEL Pode-se converter de um tipo de variável para outro explicitamente. implicitamente. porém.CD_DEPTO%TYPE W_DEP_ROW DEPTO%ROWTYPE CURSOR W_C1 IS SELECT cd_depto. __________________________________________________________________________________________ 89 . SMALLINT := 0.variável de tipo idêntico a variável da da base de dados cd_depto .nomeia uma exceção definida pelo usuário. sintaxe: <nome da exceção> EXCEPTION Ex.o valor inicial é obrigatório */ . em muitas situações a PL/SQL pode converter o tipo de caracter em outro.variável de tipo data . nm_depto FROM DEPTO.possui as mesmas colunas de w_c1 BEGIN SELECT * INTO W_DEP_ROW FROM DEPTO WHERE cd_depto = ‘A00’. A PL/SQL utiliza uma das seguintes funções para executar esta conversão: TO_CHAR TO_VARCHAR2 CHARTOROWID HEXTORAW TO_BINARY_INTEGER TO_DATE TO_NUMBER ROWIDTOCHAR RAWTOHEX EXEMPLOS DE DECLARAÇÕES DECLARE W_DATA W_CONTADOR W_CODIGO W_TESTE W_CODIGO2 W_COD_DEP DATE.14159. END IF.

Pode-se usar o atributo %ROWTYPE para representar uma linha em uma tabela da base. A PL/SQL implicitamente declara um cursor para cada comando SQL que manipule dados.: LOOP FETCH w_c1 INTO w_c1_row. 4.column>%TYPE/<table>%rowtype IS <comando SELECT >.<parâmetro <tipo>. 3. Pode-se usar %TYPE para representar o tipo de uma variável.. . sintaxe: <cursor>%NOTFOUND SQL%NOTFOUND Ex. vl_sal FROM func.indica se o último FETCH retornou uma linha ou não.. para cursores explícitos. UPDATE ou DELETE para cursores implícitos. __________________________________________________________________________________________ 90 . IF w_c1%FOUND THEN • %NOTFOUND . Um cursor deve estar associado a um comando SELECT com mesmo número. CURSOR w_c2 (dat_ini DATE) IS SELECT cd_mat. UPDATE ou DELETE para cursores implícitos. tipo e ordem de elementos selecionados que os da cláusula RETURN.: LOOP FETCH w_c1 INTO w_c1_row. END LOOP. ATRIBUTOS PARA CURSOR Existem 2 tipos de cursores em PL/SQL: implícito e explícito. nm_func FROM func WHERE de_nasc > dat_ini.])] RETURN<tipo>/<variável%TYPE/<table. E se alguma row foi afetada pelo último comando INSERT.__________________________________________________________________________________________ sintaxe: CURSOR <nome cursor>[(<parâmetro> <tipo>[. • %FOUND .indica se o último FETCH retornou uma row ou não. Ex.. A cláusula RETURN define o tipo de dado do resultado de um cursor. onde: 1. sintaxe: <cursor> %FOUND SQL%FOUND Ex.: DECLARE CURSOR w_c1 IS SELECT cd_mat. 2. para cursores explícitos. constante ou coluna da base.. IF w_c1%NOTFOUND THEN EXIT. E se alguma row foi afetada pelo último comando INSERT. inclusive queries que retornem uma única row.

01 AND 1000. sintaxe: <cursor>%ISOPEN SQL%ISOPEN Ex. Em função da necessidade de se emitir vários relatórios sobre o cálculo efetuado.: LOOP FETCH w_c1 INTO w_c1_row. ELSE val_ir := val_sal *30. ELSIF val_sal BETWEEN 300. No caso de cursores implícitos o resultado será sempre FALSE. w_vl_ir NUMBER(15. w_vl_inss NUMBER(15. val_ir OUT NUMBER) IS BEGIN IF val_sal < 300. w_vl_lim NUMBER(15.2). IF w_c1% ROWCOUNT THEN . será gerada uma tabela intermediária com os resultados para posterior impressão. o valor de ROWCOUNT é zero. PROBLEMA PROPOSTO Deseja-se calcular e emitir a folha de pagamento de uma empresa.indica o número de rows lidas para o cursor associado (para cursores explícitos) ou o número de rows afetadas no último comando INSERT. END.00 THEN val_ir := 0.permite que se verifique se um cursor está aberto ou não.. vl_sal * . uma vez que o Oracle fecha o cursor após uma operação.01 AND 3000. sintaxe: <cursor>%ROWCOUNT SQL %ROWCOUNT Ex. O número só será incrementado SE O ÚLTIMO FETCH retornou uma row. val_lim IN NUMBER) RETURN NUMBER IS val_inss NUMNER(15. ELSIF val_sal BETWEEN 1000. vl_sal.2) :=&1. DELETE ou SELECT (para cursores implícitos). w_c1_row w_c1 %ROWTYPE.00 THEN val_ir := val_sal *20.. FUNCTION inss (val_sal IN NUMBER. Após a abertura do cursor.00 THEN val_ir := val_sal *10. BEGIN __________________________________________________________________________________________ 91 .2) := 0 tabela inválida EXCEPTION. PROCEDURE ir (val_sal IN NUMBER..2) := 0. UPDATE.10 fgts FROM func. END IF.. • %ROWCOUNT .__________________________________________________________________________________________ • %ISOPEN . RESOLUÇÃO: DECLARE CURSOR w_c1 IS SELECT cd_mat.: IF NOT (w_c1%ISOPEN) THEN .

END inss. EXIT WHEN w_c1%NOTFOUND.. Ex. COMMIT. w_vl_inss.__________________________________________________________________________________________ val_inss := val_sal *. CLOSE w_c1.verifica se uma variável tem o valor = NULL 7.. vl_fgts) VALUES (w_c1_row. vl_sal. . COMMIT. portanto que as variáveis antes de serem usadas sejam inicializadas. 6.vl_sal.vl_sal. Definição: FUNCTION SQLERRM [(error_number NUMBER)] RETURN CHAR __________________________________________________________________________________________ 92 . w_vl_ir. END LOOP. ir(w_c1_row. IF sim_não IS NULL THEN . É importante.cd_mat. FUNÇÕES PRÉ-DEFINIDAS A PL/SQL permite a utilização de diversas funções pré-definidas para manipulação dos dados. CONTROLE DE ERROS SQLCODE Função numérica que retorna o código do erro associado à última exceção. INSERT INTO folha (cd_mat. Podese usá-las onde expressões do mesmo tipo são permitidas.08. BEGIN DELETE FROM folha. OPEN w_c1. LOOP FETCH w_c1 INTO w_c1_row. sim_não := (contador > 500). w_c1_row.: sim_não boolean. vl_ir. w_vl_ir). Por default. SQLERRM Função string que retorna a mensagem de erro associado ao último SQLCODE. Definição: Ex. w_vl_inss := inss(w_c1_row.vl_sal. IF val_inss := > val_lim THEN val_inss := val_lim. as variáveis são inicializadas com “NULL”. vl_inss. END. w_c1_row. END IF. RETURN val_inss.fgts).: FUNCTION SQLCODE RETURN NUMBER <variável> := SQLCODE.w_vl_lim). ATRIBUIÇÕES As variáveis e constantes são inicializadas cada vez que é iniciado o bloco em que elas estão declaradas.

LN Retorna o logaritmo natural do argumento. que deve ser maior que zero. COS Retorna o coseno do argumento.: FUNCTION COS (<n> NUMBER) RETURN NUMBER <variável> := COS (<variável2>). COSH Retorna o coseno hiperbólico do argumento. Definição: Ex. __________________________________________________________________________________________ 93 .: FUNCTION LN (<n> NUMBER) RETURN NUMBER <variável> := LN (<variável2>). que deve ser expresso em radianos.71828) é a base do logaritmo neperiano. onde e (~2.29578 para ser convertido para radianos.: FUNCTION ABS (<n> NUMBER) RETURN NUMBER <variável> := ABS (<variável2>). Obs. NUMÉRICAS ABS Retorna o valor absoluto do argumento. Definição: Ex. Definição: Ex. CEIL Retorna o menor inteiro maior ou igual ao argumento. Definição: Ex. basta que seja dividido por 57.: FUNCTION FLOOR(<n> NUMBER) RETURN NUMBER <variável> := FLOOR (<variável2>).__________________________________________________________________________________________ Ex. Definição: Ex.: <variável> := SQLERRM(-1023).: FUNCTION EXP (<n> NUMBER) RETURN NUMBER <variável> := EXP (<variável2>). Definição: Ex. FLOOR Retorna o maior inteiro menor ou igual ao argumento. Definição: Ex. EXP Retorna e elevado à n-esima potência.: FUNCTION COSH (<n> NUMBER) RETURN NUMBER <variável> := ABS (<variável2>).: se <n> estiver em graus.: FUNCTION CEIL(<n> NUMBER) RETURN NUMBER <variável> := CEIL (<variável2>).

Definição: Ex. SQRT Retorna a raiz quadrada do argumento. Definição: Ex. SINH Retorna o seno hiperbólico do argumento. ROUND Retorna <m> arredondado para <n> casas decimais.: FUNCTION SINH (<n> NUMBER) RETURN NUMBER <variável> := SINH (<variável2>). (<variável3>). zero será assumido. (<variável3>).: FUNCTION POWER (<n> NUMBER) RETURN NUMBER <variável> := POWER (<variável2>). MOD Retorna o resto da divisão de <m> por <n>.: FUNCTION EXP (<n> NUMBER) RETURN NUMBER <variável> := SIN (<variável2>). Se <n> for omitido.: FUNCTION SIGN (<n> NUMBER) RETURN NUMBER <variável> := SIGN (<variável2>). <n> deve ser inteiro.29578 para ser convertido para radianos.__________________________________________________________________________________________ LOG Retorna o logaritmo de <n> na base <m>. que deve ser expresso em radianos. <m> é retornado. Definição: Ex. Definição: Ex. SIGN Retorna –1 se o argumento for negativo. Se <m> for negativo. sendo que <m> deve ser maior que 1 e <n> deve ser maior que 1 e <n> deve ser maior que zero.: FUNCTION ROUND (<n> NUMBER) RETURN NUMBER <variável> := ROUND (<variável2>). basta que seja dividido por 57. SIN Retorna o seno de <n>. Definição: Ex.: FUNCTION LOG (<n> NUMBER) RETURN NUMBER <variável> := LOG (<variável2>). Definição: Ex. POWER Retorna o número <m> elevado à <n>-ésima potência. Obs. Definição: Ex. que não pode ser negativo.: Se <n> estiver em graus.: FUNCTION SQRT (<n> NUMBER) RETURN NUMBER <variável> := SQRT (<variável2>).: FUNCTION MOD (<n> NUMBER) RETURN NUMBER <variável> := MOD (<variável2>). Se <n> for zero. __________________________________________________________________________________________ 94 . Definição: Ex. 0 se igual a zero ou 1 se o argumento for maior que zero.

zero será assumido. Definição: Ex. É o contrario da função ASCII.: FUNCTION TAN (<n> NUMBER) RETURN NUMBER <variável> := TAN (<variável2>). TANH Retorna a tangente hiperbólica do argumento. Definição: Ex.: FUNCTION TRUNC (<n> NUMBER) RETURN NUMBER <variável> := TRUNC (<variável2>).<str2> VARCHAR2) RETURN <variável> := CONCAT (<variável2>. Definição: VARCHAR2 Ex. CARACTERES ASCII Retorna o código ASCII correspondente à string informada no argumento.: FUNCTION INITCAP (<str> VARCHAR2) RETURN VARCHAR2 <variável> := INITCAP (<variável2>). começando na posição <pos>. INSTR Retorna a posição da <n>-ésima ocorrência de <str2> dentro de <str1>. Definição: Ex. Definição: Ex.: FUNCTION CHR (<n> NUMBER) RETURN CHR <variável> := CHR (<variável2>). TRUNC Retorna o número <m> truncado para <n> casas decimais. CONCAT Retorna uma string que é o resultado da concatenação de <str1> (na frente) com <str2>. Se o <n> for omitido. Definição: Ex.: FUNCTION TANH (<n> NUMBER) RETURN NUMBER <variável> := TANH (<variável2>). __________________________________________________________________________________________ 95 . que deve ser expresso em radianos.: FUNCTION CONCAT (<str1> VARCHAR2.__________________________________________________________________________________________ TAN Retorna a tangente de <n>. Definição: Ex. CHR Retorna a string correspondente à representação numérica informada como argumento.: FUNCTION ASCII (<str> VARCHAR2) RETURN NUMBER <variável> := ASCII (<variável2>). INITCAP Retorna a primeira letra de cada palavra do argumento em letra maiúscula e as demais em minúsculas.<variável3>).

Definição: Ex. __________________________________________________________________________________________ 96 .’*’). Definição: Ex.: <variável> := RPAD (<variável2>. da esquerda para direita.: FUNCTION LPAD (<str> VARCHAR2.<len> NUMBER [.<pad> VARCHAR2]) VARCHAR2 <variável> := LPAD (<variável2>.: FUNCTION LTRIM (<str> VARCHAR2 [.’*’). o comprimento incluirá os brancos. com os caracteres <pad> para que o tamanho da string resultado seja <len>. <variavel3>.: FUNCTION LENGTH (<str> VARCHAR2) RETURN NUMBER <variável> := LENGTH (<variável2>). <variável3>).: FUNCTION INSTR (<str1> VARCHAR2. <comprimento>. LPAD Completa à esquerda. com os caracteres <pad> para que o tamanho da string resultado seja <len>. Definição: RETURN Ex.<pad> VARCHAR2]) RETURN VARCHAR2 (<n> NUMBER) RETURN NUMBER Ex. Definição: Ex. todas as ocorrências se <str2> serão removidas. Se <str3> não for informado.<variável3). <variável2>. REPLACE Retorna <str1> com cada ocorrência de <str2> substituída por <str3>. da direita para esquerda.: FUNCTION LOWER (<str> VARCHAR2) RETURN VARCHAR2 <variável> := LOWER (<variável2>). os caracteres <set> até que seja encontrado um caracter diferente de <set>. < tamanho>. os caracteres <set> até que seja encontrado um caracter diferente de <set>.<str2> VARCHAR2[. RPAD Completa. LENGTH Retorna o número de caracteres da string <str>. LTRIM Retira .<len> NUMBER [. Se o argumento é um item definido como CHAR. RTRIM Retira .<n> NUMBER ]]) RETURN NUMBER <variável> := INSTR (<variável2>. <set> VARCHAR2]) RETURN VARCHAR2 <variável> := LTRIM (<variável2>.<str2> VARCHAR2) [<pos> NUMBER [.__________________________________________________________________________________________ Definição: Ex. o resultado da função será NULL. LOWER Retorna o argumento com todas as letras minúsculas.<n>). Se <str> for null. Se nem <str2> nem <str3> forem informadas a função retornará NULL. Definição: FUNCTION RPAD (<str> VARCHAR2.<pos>. Definição: Ex.: FUNCTION REPLACE (<str1> VARCHAR2. à direita.<str3> VARCHAR2]) RETURN VARCHAR2 <variável> := REPLACE (<variável1>.

Definição: Ex. TRANSLATE Retorna <str>. SUBSTR Retorna uma parte da string <str>.<dte2> DATE) RETURN DATE Ex.: FUNCTION RTRIM (<str> VARCHAR2 [. <pos> NUMBER [. Definição: Ex. <tamanho>).<set3> CHAR) RETURN VARCHAR2 <variável> := TRANSLATE (<variável2>. Definição: Ex. <set1> VARCHAR2. v_dt_nasc) /12. Definição: Ex. serão removidos do resultado. a partir da posição <pos> por <len> caracteres. <n. deve ser um inteiro e pode ser negativo.<len> NUMBER]) RETURN VARCHAR2 <variável> := SUBSTR (<variável2>.: FUNCTION ADD_MONTHS (<dte> DATE. e esses caracteres estiverem presentes em <str>. GHIJKL’).: FUNCTION SUBSTR (<str> VARCHAR2.: <variável> := MONTHS_BETWEEN (sysdate. Definição: Ex. DATAS ADD_MONTHS Retorna a data <dte> adicionada de <n> meses. Definição: Ex. substituindo cada um dos caracteres presentes em <set1> pelo caracter correspondente em <set2>.: FUNCTION TRANSLATE (<str> VARCHAR2. Definição: FUNCTION MONTHS_BETWEEN (<dte1> DATE. LAST_DAY Retorna a data do último dia do mês de <dte>. Se <set1> tiver mais caracteres que <set2>. ‘ABCDEF’. SOUNDEX Retorna um string que represente o som de <str>. retorna o restante da string. Se l<len> for omitido.: FUNCTION SOUNDEX (<str> VARCHAR2) RETURN VARCHAR2 <variável> := SOUNDEX (<variável2>). __________________________________________________________________________________________ 97 . <posição inicial>. <variável3>). MONTHS_BETWEEN Retorna o número de meses entre <dte1> e <dte2>.: FUNCTION UPPER (<str> VARCHAR2) RETURN VARCHAR2 <variável> := UPPER (‘texto’).__________________________________________________________________________________________ Definição: Ex.: FUNCTION LAST_DAY (<dte> DATE) RETURN DATE <variável> := LAST_DAY (<v_dt_adm>). UPPER Retorna o argumento com todas as letras maiúsculas. <n>NUMBER) RETURN DATE <variável> := ADD_MONTHS (v_dt_nasc. <set> VARCHAR2]) RETURN VARCHAR2 <variável> := RTRIM (<variável2>.4).

<day> VARCHAR2) RETURN DATE <variável> := NEXT_DAY (sysdate. SYSDATE Retorna a data e hora correntes. representado <dte> truncada na unidade correspondente. <fmt> VARCHAR2 ) RETURN DATE <variável> := TRUNC (sysdate. DY. Definição: Ex. MON. ROUND Retorna <dte> arredondado para o formato especificado. D HH. PDT Atlantic Standard ou Daylight Time Greenwitch Pacific Standard ou Daylight Time NEXT_DAY Retorna a data do primeiro dia da semana nomeado por <day> que seja posterior a <dte>. Definição: Ex. TRUNC Retorna uma data no formato especificado por <fmt>. J DAY. Definição: Ex.<fmt>]) RETURN DATE <variável> := ROUND (sysdate. ‘AST’.: FUNCTION ROUND (<dte> [. YEAR.’ww’).: FUNCTION NEXT_DAY (<dte> DATE. YY. HH12.: FUNCTION SYSDATE RETURN DATE <variável> := SYSDATE . HH24 MI Século Ano Quarto de ano Mês Início da semana do ano Início da semana do mês Dia Último Sábado Hora Minuto __________________________________________________________________________________________ 98 .: FUNCTION TRUNC (<dte> DATE [. ABREVIATURAS PARA MERIDIANOS AST.: FUNCTION NEW_TIME (<dte> DATE.’ww’).__________________________________________________________________________________________ NEW_TIME Converte a data e hora que está no meridiano <zon1>.ADT GMT PST. YYY. Y Q MONTH. DD. MM WW WHERE DDD. SYEAR. <zon2> VARCHAR2) RETURN DATE <variável> := NEW_TIME (v_dt_nasc. Definição: Ex.<zon1> VARCHAR2. para a data e hora no meridiano <zon2>. YYYY. FORMATOS PARA ROUND E TRUNC CC SYYY. Definição: Ex.’GMT’). ‘moday’).

<fmt> VARCHAR2 [. Definição: Ex.<NLS2>]]) RETURN VARCHAR2 <variável> := TO_CHAR(5678.’). TO_CHAR Converte um valor numérico ou data para o formato especificado.” na posição correspondente. RAWTOHEX Converte um valor binário em uma string hexadecimal do tipo VARCHAR2. .999.99 99. onde <n> corresponde ao número de 9’s após V Notação científica Maiúscula ou minúscula para numerais romanos __________________________________________________________________________________________ 99 . Definição: Ex. ROWIDTOCHAR Converte o valor binário de <bin> para uma string hexadecimal de 18 bytes.rn 9.99 999V99 E RN. V 9999 0999 $999 B999 999MI S999 999PR 99D99 99G99 99. Definição: Ex.000ª0007’). ‘9.99EEEE RN A quantidade de 9’s determina o comprimento Completa com zeros à esquerda em vez de brancos Prefixa o valor com o símbolo $ Substitui o valor 0 por branco Mostra “-“ após um valor negativo Coloca um “-“ ou um “+” antes do número. ‘.__________________________________________________________________________________________ CONVERSÃO CHARTOROWID Converte a string <str> do tipo CHAR ou VARCHAR2 para ROWID.: FUNCTION RAWTOHEX (<bin> RAW) RETURN VARCHAR2 <variável> := RAWTOHEX (<variável do tipo raw). FORMATOS NUMÉRICOS PARA TO CHAR E TO NUMBER 9 0 $ B MI S PR D G .: FUNCTION TO_CHAR (<dte> DATE [.99’.<nls1>]]) RETURN VARCHAR2 FUNCTION TO_CHAR (<n> NUMBER) [. ‘nls_numeric_characters =’. HEXTORAW Converte uma string hexadecimal do tipo CHAR ou VARCHAR2 para RAW.: FUNCTION ROWIDTOCHAR (<bin> ROWID) RETURN VARCHAR2 <variável> := ROWIDTOCHAR (<variável do tipo rowid).32.” decimal na posição correspondente.: FUNCTION HEXTORAW (<str> CHAR) RETURN RAW FUNCTION HEXTORAW (<str> VARCHAR2) RETURN RAW <variável> := HEXTORAW (‘F6’).: FUNCTION CHARTOROWID (<str> CHAR) RETURN ROWID <variável> := CHARTOROWID (‘00000000E. Mostra um “. Definição: Ex. Definição: Ex. Mostra um valor negativo entre <> Inclui o caracter decimal Inclui o caracter separador de milhar Mostra uma “.<fmt> VARCHAR2[. Multiplica o valor por 10<n>.

: FUNCTION TO_NUMBER (<str> VARCHAR2 [.’). YEAR.__________________________________________________________________________________________ FORMATOS DE NLS ‘NLS_DATE_LANGUAGE = <language>’ ________________para <nls1> ‘NLS_NUMERIC_CHARACTERS = ‘ ‘<d> <g>’. __________________________________________________________________________________________ 100 . NLS_CURRENCY = “<text>” NLS_ISSO_CURRENCY = “<text>” ____________ para <nls2> Onde: <d> <g> <text> caracter decimal separador de milhar símbolo monetário TO_DATE Converte uma string ou um número para o formato data.999. YYY. HH12.99’. Definição: Ex. SCC SYYY. Definição: Ex. <nls2> ]]) RETURN NUMBER <variável> := TO_NUMBER (‘5.: FUNCTION TO_DATE (<str> VARCHAR2[. SYEAR.<fmt> VARCHAR2 [. ‘nls_numeric_characters = ‘ . HH24 MI SS Século Ano Quarto de ano Mês por extenso Mês abreviado para três letras Mês (numérico) Semana do ano Semana do mês Início da semana do mês Dia do ano Dia do mês Dia da semana Nome do dia Dia abreviado p/ 3 letras Dia em data Juliana Hora Minuto Segundo TO_NUMBER Converte <str> para o valor numérico correspondente.678. YY. ‘dd/mm/yy’) FORMATOS DE DATA PARA TO_CHAR E TO_DATE CC.<nls1>]]) RETURN DATE <variável> := TO_DATE (‘12/01/84’. YYYY.32’. Y Q MONTH MON MM WW WHERE WHERE DDD DD D DAY DY J HH. ‘. ‘9. MISCELÂNEA DECLARE Só é permitido em comandos SQL.

retorna <expr2>.: FUNCTION USER RETURN VARCHAR2 <variável> := USER. UID Retorna o valor do inteiro associado a cada username pelo Oracle.) <variável> := LEAST(‘aaaa’. Definição: Ex. USERENV Retorna informações sobre o user e a sessão. Definição: Ex.: FUNCTION VSIZE (<exp> DATE l NUMBER l VARCHAR2) RETURN NUMBER <variável> := VSIZE (sysdate). retorna <expr1>.: FUNCTION LEAST (<expr1>..: FUNCTION USERENV (<str> VARCHAR2) RETURN VARCHAR2 <variável> := USERENV (‘terminal’). <expr2>. Definição: Ex. Definição: Ex. ‘bbb’. __________________________________________________________________________________________ 101 . NVL Se <expr1> for null. Valores de <str> entryid sessionid terminal language identificador da entrada Identificador da sessão identificador do terminal identificador da linguagem em uso VSIZE Retorna o número de bytes usado para armazenar a representação interna de <expr>. Definição: Ex.. Todas as expressões após a primeira são convertidas para o tipo de dado da primeira antes da comparação ser feita...: FUNCTION GREATEST (<expr1>. Todas as expressões após a primeira são convertidas para o tipo de dado da primeira antes da comparação ser feita. <expr2>.. Se <expr1> não for null.) <variável> := GREATEST (‘aaaa’.__________________________________________________________________________________________ GREATEST Retorna a maior <expr> da lista de valores.: FUNCTION UID RETURN NUMBER <variável> := UID. ‘cccc’). USER Retorna o username corrente. Definição: Ex.. <expr2>.) RETURN <ret> Onde: <ret> será de tipo igual a <expr1> e <expr2> Ex. Definição: FUNCTION NVL ((<expr1>. ‘cccc’). LEAST Retorna a menor <expr> da lista de valores.: <variável> := NVL (v_nr_gir. ‘bbb’.0).

__________________________________________________________________________________________ 102 . END LOOP. W_c1_row w_c1%ROWTYPE w_cd_depto number(3). 1. END IF.2. BEGIN OPEN w_c1. ELSIF w_str_depto = ‘B’ THEN w_cd_depto :=200.total).cd_depto. IF w_c1%NOTFOUND THEN CLOSE w_c1. convertendo o código do departamento da seguinte forma: • • • departamentos AXX departamentos BXX e assim por diante somar 100 ao número do departamento somar 200 ao número do departamento RESOLUÇÃO DECLARE CURSOR w_c1 IS SELECT cd_depto. ELSIF w_str_depto = ‘E’ THEN w_cd_depto :=500. LOOP FETCH w_c1 INTO w_c1_row. ENDIF.__________________________________________________________________________________________ PROBLEMA PROPOSTO: Gravar na tabela RESULTADO a quantidade de funcionários por departamento. ELSIF w_str_depto = ‘C’ THEN w_cd_depto :=300. w_str_depto varchar(1). campo) VALUES (w_cd_depto. ELSIF w_str_depto = ‘D’ THEN w_cd_depto :=400. w_cd_depto := w_cd_depto+ TO_NUMBER(SUBSTR(w_c1_row. 1).count(*) total FROM func GROUP BY cd_depto. W_str_depto := SUBSTR (w_c1_row. END. IF w_str_depto = ‘A’THEN w_cd_depto := 100.2)). INSERT INTO RESULTADO (ordem.cd_depto.w_c1_row. EXIT.

. sintaxe: EXIT [ <label>] [WHEN <condição>] Ex.: LOOP FETCH w_c1 INTO w_c1_row..um comando executável EXIT Encerra um loop.i THEN . __________________________________________________________________________________________ 103 . – encerra ambos os loops END LOOP. Deve existir um comando após o LABEL....: <<externo>> FOR i IN 1..10 LOOP IF externo. Utilizado para desvios e para qualificação. COMANDOS LABELS Identifica um comando ou conjunto de comandos... ENDIF END LOOP. -. ENDIF EXIT externo WHEN.10 LOOP IF inetrno i THEN ..__________________________________________________________________________________________ 8.. ENDIF. IF w_c1%FOUND THEN calc_ir. ..este comando é ilegal porque END não é End. END LOOP externo... sintaxe: <<label>> Ex. INSERT ELSE EXIT. <<fim>> -. <<Interno>> FOR i IN 1..

__________________________________________________________________________________________ IF THEN ELSE A seqüência de comandos só será executada se a condição for verdadeira. <expressão PLSQL>]) I <expressão PLSQL> { <nome cursor> I SQL} {%NOTFOUND I %FOUND I%ISOPEN} __________________________________________________________________________________________ 104 . <condição> [NOT] <expressão boleana> [[AND I OR ] <expressão boleana>] <expressão boleana>] <literal boleano> I <variável boleana> I <chamada de função boleana> I (<expressão boleana>) I <expressão PLSQL> <operador relacional> <expressão PLSQL> I <expressão PLSQL> IS [NOT] NULL I <expressão PLSQL> [NOT] LIKE <pattern> I <expressão PLSQL> [NOT] BETWEEN <expressão PLSQL> AND <expressão PLSQL> I <expressão PLSQL> [NOT] IN (<expressão PLSQL>[. ou IF <condição> THEN <seqüência de comandos> ELSE <seqüência de comandos> END IF. sintaxe: IF <condição> THEN <seqüência de comandos> END IF. ou IF <condição> THEN <seqüência de comandos> ELSIF <condição> THEN <seqüência de comandos> ELSE <seqüência de comandos END IF.

00 THEN val_ir := val_sal * .01 and 3000.. LOOP FETCH WHERE_C1 INTO w_c1_row.20.10. END IF. sintaxe: [<< <label> >>] LOOP <sequencia de comandos> END LOOP ou LOOP <sequencia de comandos> IF . ELSEIF val_sal BETWEEN 1000.encerra o loop END IF. LOOP A seqüência de comandos é executada num número infinito de vezes ou até que seja encontrado um comando “EXIT” ou a condição de “WHEN” seja satisfeita... CLOSE w_c1. -.30.__________________________________________________________________________________________ Ex. calc_ir(w_c1_row. EXIT WHEN w_c1%NOTFOUND.w_vl_lim).: OPEN w_c1..00+ THEN val_ir := val_sal * . END LOOP. ELSE val_ir := val_sal * . . END LOOP. ELSIF val_sal BETWEEN 300.: IF val_sal < 300.encerra o loop END LOOP. Ex.. ou LOOP <sequencia de comandos> EXIT WHEN -. THEN EXIT. __________________________________________________________________________________________ 105 .vl_sal.01 AND 1000.00 THEN Val_ir := 0.

2). w_c1_row w_c1%ROWTYPE. w_tot_sal. média. depto. código. w_tot_med). LOOP FETCH w_c1 INTO w_c1_row. __________________________________________________________________________________________ 106 . SUM(vl_sal)soma. IF w_c1%NOTFOUND THEN CLOSE w_c1 EXIT. depto WHERE func.media. totsal. salário. w_tot_med number(10. SELECT AVG(vl_sal) INTO w_tot_med FROM func. totméd) com os valores abaixo obtidos na tabela de departamento: • • • • • • nome código salário média totsal totméd nome do departamento código do departamento somatório dos salários do departamento correspondente média salarial do departamento correspondente total de salários da tabela de funcionários média da tabela de funcionários total RESOLUÇÃO DECLARE w_tot_sal number(10. BEGIN SELECT SUM(vl_sal) INTO w_tot_sal FROM func.cd_depto GROUP BY nm_depto. CURSOR w_ c1 IS SELECT nm_depto. totmed) VALUES (w_c1_row.2).soma. INSERT INTO tabdep (nome. w_c1_row. w_c1_row. OPEN w_c1.nm_depto. AVG(vl_sal) media FROM func. depto.cd_depto = depto. salário. END.cd_depto.cd_depto.cd_depto. código. w_c1_row. END LOOP. totsal.__________________________________________________________________________________________ PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome. média. END IF.

2).: OPEN w_c1. w_tot_med number(10. RESOLUÇÃO: DECLARE w_tot_sal number(10.media. END. w_c1_row. salário. w_tot_med). CURSOR w_c1 IS SELECT nm_depto. código.: Este problema é o mesmo anterior. w_tot_sal. SUM. depto. PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome. FETCH w_c1 INTO w_c1_row. Se for verdadeira. a condição é avaliada. w_c1_row.cd_depto. totsal. FETCH w_c1 INTO w_c1_row. sintaxe: [<< <label> >>] WHILE <condição> LOOP <seqüência de comandos> END LOOP. WHILE w_c1%FOUND LOOP INSERT INTO tabdep (nome.AVG(vl_sal)media FROM func. totmed) VALUES (w_c1_row. w_c1_row.2). CLOSE w_c1.soma. W_c1_row w_c1%ROWTYPE. BEGIN SELECT SUM(vl_sal) INTO w_tot_sal FROM func. totméd) com os valores abaixo obtidos na tabela de departamento • • • • • • nome código salário média totsal totméd nome do departamento código do departamento somatório dos salários do departamento correspondente média salarial do departamento correspondente total de salários da tabela de funcionários média da tabela de funcionários total Obs. FETCH w_c1 INTO w_c1_row. Ex. Antes de cada iteração do loop. OPEN w_c1. INSERT INTO folha END LOOP.cd_depto GROUP BY nm_depto. totsal. código.__________________________________________________________________________________________ WHILE LOOP A seqüência de comandos é executada enquanto a condição for verdadeira.cd_depto. depto. WHILE w_c1%FOUND LOOP . salário.. __________________________________________________________________________________________ 107 . média. média.. a seqüência de comandos é executada.cd_depto.cd_depto = depto. depto WHERE func. SELECT AVG(vl_sal) INTO w_tot_med FROM func.nm_depto.(vl_sal)soma. END LOOP.

EXIT início WHEN… END LOOP.. FOR i IN 3. — <seqüência de comandos> — será executado 3 vezes — i terá o valor inicial de 3 <<início>> FOR i IN 1.i > 15 THEN... — <seqüência de comandos> — <executada n vezes dependendo — do valor de início e fim Fim := 1..3 LOOP <seqüência de comandos> END LOOP.: FOR i IN 1.10 LOOP …. Vezes := i +1 — <seqüência de comandos> — executa 3 vezes — o comando vezes é inválido. END LOOP.. END LOOP INÍCIO. — esta forma de interrupção — do loop (exit <label> when.. uma vez que não se pode alterar o valor de <contador> durante a iteração.10 LOOP IF início..3 LOOP <seqüências de comandos> END LOOP. — <seqüência de comados> — não será executada FOR IN REVERSE 1.. pois i só — existe no escopo do comando FOR FOR i IN início.) — encerra os dois níveis — de loops __________________________________________________________________________________________ 108 .__________________________________________________________________________________________ FOR LOOP A seqüência de comandos é executada um número fixo de vezes estabelecido no comando.. sintaxe: [<< <label> >>] FOR <contador> IN [REVERSE] <inferior>. Ex.25 LOOP FOR i IN 1. No início do comando a quantidade de vezes que o mesmo será executado já é conhecida.<superior> LOOP <seqüência da comandos> END LOOP.25 LOOP FOR i IN 1..fim LOOP <seqüência de comandos> END LOOP.. — a variável usada em um loop — é automaticamente declarada pela PL/SQL — no exemplo foram criadas — duas variáveis i — a referência ao nível — externo é feita através — do label <<início>> FOR i IN 1.. END LOOP início.fim LOOP <seqüência de comandos> END LOOP..

média. BEGIN END. totsal. … <<fim>> — este label é porque END — não é um comando executavél NULL Este comando explicitamente indica que não há ação a ser feita. — o comando “null” resolve — o problema anterior END. totméd) com os valores abaixo obtidos na tabela de departamento: • nome nome do departamento • código código do departamento • salário somatório dos salários do departamento correspondente • média média salarial do departamento correspondente • totsal total de salários da tabela de funcionários • totméd média da tabela de funcionários total Obs: Este problema é o mesmo anterior. Ex.__________________________________________________________________________________________ GOTO Desvia incondicionalmente para um “label”. sintaxe: NULL. salário.: BEGIN … GOTO inclui. PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome. Serve para compor certas situações em que um comando é exigido. __________________________________________________________________________________________ 109 . mas nenhuma ação é realmente necessária. sintaxe: GOTO << <label> >> Ex.: BEGIN … <<fim>> NULL. o qual deve ser dentro do scopo e deve preceder um comando ou um bloco da PL/SQL. código. GOTO altera. … <<altera>> BEGIN UPDATE func — o desvio pode ser para traz … END. — desvio para o comando INSERT … <<inclui>> INSERT INTO func… END.

.. END IF.. Consideramos que a sintaxe dos comandos SQL já é de conhecimento dos leitores e não serão repetidos nesta apostila. END. totméd) VALUES (w_c1row. RENAME. a PL*SQL permite a utilização de quase todos os comandos SQL.cd_depto.__________________________________________________________________________________________ RESOLUÇÃO: DECLARE w_tot_sal number(10. média. COMUNICAÇÃO COM O SQL Por ter uma extensão do SQL. GROUP BY nm_depto. . <<ler>>> FETCH w_c1 INTO w_c1_row. __________________________________________________________________________________________ 110 .])] Ex.. 9. cd_mat FROM func WHERE cd_mat <= matrícula... REVOKE.cd_depto.2) CURSOR w_c1 IS SELECT nm_depto.. END.. w_c1_row.) e os de “DDL” (GRANT. totsal. w_tot_sal.. depto.media. w_c1_row.2) w_tot_med number(10. depto. w_tot_med). AVG(vl_sal)media FROM func.cd_depto. SUM(vl_sal) soma. OPEN w_c1. <parâmetro> .: DECLARE CURSOR w_c2 (matrícula NUMBER) IS SELECT nm_func. sintaxe: OPEN <cursor> [(<parâmetro> [. código.cd_depto = depto.).nm_depto. salário. Foram excluídos desta lista dos comandos de “DDL” (ALTER..soma). CREATE. BEGIN SELECT SUM(vl_sal) INTO w_tot_sal FROM func: SELECT AVG(vl_sal) INTO w_tot_med FROM func. w_c1_row w_c1% ROWTYPE. GOTO ler.w_c1_row. OPEN CURSOR Executa o query associado com uma declaração explícito de cursor. BEGIN OPEN w_c2 (350).. IF w_c1%FOUND THEN INSERT INTO tabdep (nome. depto WHERE func.cd_depto.

vl_ir. INSERT INTO folha (cd_mat. vl_sal. w_c2_row. vl_inss. w_vl_inss. vl_fgts) VALUES (w_c2_row. abre um cursor. PROBLEMA PROPOSTO: Preencher a tabela TABDEP (nome. w_c2_row.. Ex.])] LOOP <seqüência de comandos> END LOOP. w_vl_ir).vl_sal..fgts). totméd) com os valores abaixo obtidos na tabela de departamento: • nome nome do departamento • código código do departamento • salário somatório dos salários do departamento correspondente • média média salarial do departamento correspondente • totsal total de salários da tabela de funcionários • totméd média da tabela de funcionários total Obs: Este problema é o mesmo anterior.: DECLARE CURSOR w_c2 IS SELECT cd_mat. código. sintaxe: [<< <label> >>] FOR <RECORD> IN <cursor> [(<parâmetro> [. salário.. vl_sal. COMMIT. END. w_vl_inss := calc_inss(w_c2_row. COMMIT.vl_sal. vl_sal * . média. w_vl_lim).__________________________________________________________________________________________ CURSOR LOOP Implicitamente declara uma área para receber a row. . totsal. END LOOP.vl_sal. BEGIN DELETE FROM folha.cd_mat. __________________________________________________________________________________________ 111 . w_vl_ir. lê cada row e fecha o cursor quando todas as rows tiverem sido processadas..<parâmetro> . FOR w_c2_row IN w_c2 LOOP calc_ir(w_c2_row.10 fgts FROM func.

totméd) VALUES (w_c1row. GROUP BY nm_depto.w_c1_row. w_tot_med). Para as demais. __________________________________________________________________________________________ 112 . w_c1_row. como veremos neste capítulo. w_c1_row.2) CURSOR w_c1 IS SELECT nm_depto. código. As exceções criadas pelo programa deverão ser setadas explicitamente pelo verbo RAISE.media. TRATAMENTO DE ERROS Em PL/SQL uma warning ou error condition é chamada uma exception. FOR w_c1row IN w_c1 LOOP INSERT INTO tabdep (nome. uma exception é setada. w_tot_sal. isto é.cd_depto. AVG(vl_sal)media FROM func.cd_depto. a seqüência de execução do programa é interrompida e o controle é transferido para a área de tratamento de execução do programa. SELECT AVG(vl_sal) INTO w_tot_med_ FROM func. END. 10. Quando um erro ocorre.nm_depto.cd_depto. podem ser dados nome pelo usuário. salário. SUM(vl_sal) soma.soma.cd_depto.__________________________________________________________________________________________ RESOLUÇÃO: DECLARE w_tot_sal number(10. depto. média. depto WHERE func.2) w_tot_med number(10. Existem algumas exceções já definidas pelo Oracle com minemônicos para referência. totsal.cd_depto = depto. As exceções pré-definidas pelo Oracle são setadas quando a condição de erro ocorre. depto. END LOOP. BEGIN SELECT SUM(vl_sal) INTO w_tot_sal_ FROM func.

truncation ocorrer. É setada se ocorrer timeout enquanto o ORACLE estiver aguardando por um recurso. É setada se for feita uma operação ilegal com um cursor. É setada se for tentada uma inclusão de uma coluna com valor duplicado em uma tabela que possui um índice unique nesta coluna. constraint error. É setada se num SELECT INTO nenhuma row foi retornada ou se foi feita uma referência a uma row não inicializada em uma tabela PL/SQL. conversão. É setada se PL/SQL sai da memória ou se a memória estiver corrompida. É setada se for feita uma tentativa de logon com um username/password inválido. É setada se uma programa PL/SQL tenata fazer acesso ao database sem efetuar um logon. Por exemplo: CLOSE em um cursor não aberto. A transação local deve ser desmanchada também. É setada se ocorrer um problema interno. __________________________________________________________________________________________ 113 . É setada se um comando SELECT INTO retormar mais que uma row. É setada se houver ocorrido uma divisão por zero.__________________________________________________________________________________________ EXCEÇÕES PRÉ-DEFINIDAS Nome da Exceção CURSOR_ALREADY_OPEN Oracle Error ORA-06511 SQLCODE -6511 DUP_VAL_ON_INDEX ORA-00001 -1 INVALID_CURSOR ORA-01001 -1001 INVALID_NUMBER ORA-01722 -1722 LOGIN_DENIED ORA-01017 -1017 NO_DATA_FOUND ORA-01403 +100 NOT_LOGGED_ON ORA-01012 -1012 PROGRAM_ERROR ORA-06501 -6501 STORANGE_ERROR ORA-06500 -6500 TIME_ON_RESOURSE ORA-00051 -51 TOO_MARY_ROWS ORA-014222 -1422 TRANSACTION_BACKED_O UT ORA-00061 -61 VALUE_ERROR ORA-06502 -6502 ZERO_DIVIDE ORA-01476 -1476 Condição de Erro É setada se for executado um OPEN para um cursor já aberto. É setada se uma operação aritmética. É setada se algum comando SQL tentou uma conversão de uma string para número e esta conversão falha porque a string não representa um número. É setada quando a parte remota de uma transação é desmanchada.

ramal deve iniciar com 2. END IF. cd_depto. w_func. INSERT INTO func (cd_mat. RESOLUÇÃO: DECLARE w_salario number(7.1. e_depto exception. in_sexo. e_salario exception.: DECLARE … BEGIN SELECT … SELECT … SELECT … EXCEPTION WHEN NO_DATA_FOUND THEN … END. w_nome char(8) := &5.__________________________________________________________________________________________ Ex. w_sexo char(1) := &6. w_depto. END IF. w_sal * 12. departamento deve existir na tabela de departamentos. select count(*) into w_auxi FROM depto WHERE cd_depto = w_depto. IF w_git < 15 OR w_git > 20 THEM RAISE e_git. w_ramal. w_git number(2) := &3. nr _ramal. IF w_aux = o THEM RAISE e_depto. IF SUBSTR(TO_CHAR (nr_ramal). e_git exception. EXCEPTION WHEN e_sexo THEM __________________________________________________________________________________________ 114 . vl_sal. SELECT MAX(cd_mat) INTO w_aux FROM func. END IF. w-depto char(3) := &2. BEGIN IF w_salario < 1500 OR w_salario > 2000 THEN RAISE e_salario. END IF.1) <> ‘2’ THEM RAISE e_ramal. PROBLEMA PROPOSTO: Fazer um programa para crítica dos dados informados através de parâmetros: • • • • • salário deve estar entre R$ 1500 e R$ 2000 mensais. sexo deve ser F ou M. grau de instrução deve estar entre 15 e 20. e_salario exception. IF w_sexo <> ‘F' AND w_sexo <> ‘M’ THEM RAISE e_sexo. nr _git) VALUES (w_aux + 1. w_aux number(3) := ). END IF.2) := &1. nm _func. Na base é gravado o salário atual. w_ramal number(4) := &4. w_git). e_sexo exception. e_ramal exception. w_sexo.

‘GRAU DE INSTRUCAO INVALIDO’). WHEN OTHERS THEN RAISE_APPLICATION_ERROR (-20999. Este tipo de exceção deve ser setada explicitamente pelo verbo RAISE. sintaxe: PRAGMA EXCEPTION_INIT (<nome da exceção>. É uma opção para diminuição da lista de exceptions.__________________________________________________________________________________________ RAISE_APPLICATION_ERROR (-20001. Isto permite que se façam testes se erro mais específicos em vez de usar OTHERS. WHEN e_salario THEN RAISE_APPLICATION_ERROR (-20005. WHEN e_depto THEM RAISE_APPLICATION_ERROR (-20004. END. PRAGMA EXCEPTION_INIT Associa um nome de exceção com um número de SQLCODE. ‘SEXO INVALIDO’). END IF.: DECLARE erro_soma EXCEPTION. WHEN e_ramal THEM RAISE_APPLICATION_ERROR (-20003. … BEGIN IF … THEN RAISE erro_soma. EXCEPTION WHEN erro_soma THEN … WHEN OTHERS THEN … END. ‘SALARIO INVALIDO’). Obs.: O desvio de execução do programa é transferido para a exceção OTHERS quando o erro ocorrido não foi tratado em outras exceções mais específicas. sintaxe: RAISE <exceção> Ex. EXCEÇÕES DEFINIDAS PELOS USUÁRIOS A PL/SQL permite que sejam definidas exceções de um programa. ‘DEPARTAMENTO INVALIDO’). SQLERRM(SQLCODE)). RAISE Seta uma exceção.<número>) __________________________________________________________________________________________ 115 .

… EXCEPTION WHEN A THEN … END. Ex. for feita uma tentativa de alterar uma tabela em que o usuário só tem autorização de SELECT.: CREATE TRIGGER checa_salario … DECLARE … BEGIN … IF (:new.: <número> deve variar de -20000 a -20999 e a <mensagem> deve possuir até 512 bytes de comprimento.: BEGIN … BEGIN IF x=1 ELSIF x=2 ELSE END IF. — O ORACLE retorna o erro -1031 se.vl_sal <salario_minimo OR :new. sintaxe: RAISE_APPLICATION_ERROR (<número>. PRAGMA EXCEPTION_INIT (sem_privilegio.: DECLARE sem_privilegio EXCEPTION.vl_sal > salário_maximo) THEN RAISE_APPLICATION_ERROR (-20225. … END IF. THEN RAISE A. PROPAGAÇÃO DA EXCEÇÃO Quando uma exceção é setada. RAISE C. se PL/SQL não encontrar um tratamento para ela no bloco correto ou subprograma. Isto é. -1031). a exceção se propaga. END.__________________________________________________________________________________________ Ex. por exemplo. THEN RAISE B. Obs.<mensagem>). BEGIN … EXCEPTION WHEN sem_privilegio THEN … END. Ex. a exceção se reproduz no bloco externo e assim por diante até que a PL/SQL retorne um erro para o ambiente (abortando o programa). ‘Salário fora de faixa’). __________________________________________________________________________________________ 116 . RAISE_APPLICATION_ERROR É uma procedure que permite ao usuário enviar mensagens de um subprograma ou database trigger.

11. não e tratada e o erro passa para o ambiente. INSERT INTO tab_erro VALUES (msg). isto é. que podem receber parâmetros e ser invocados. é tratada e o programa termina normalmente. procedures. val_ir OUT NUMBER) IS BEGIN … END calc_ir. Da mesma forma que qualquer outro bloco (anônimo) PL/SQL. A exceção COMANDO SQL: se propaga para o bloco mais externo. sintaxe: SQLERRM (<sqlcode>) Ex.2). uma parte executável e uma parte opcional para tratamento de exceção. BEGIN … __________________________________________________________________________________________ 117 . Ex. val_lim IN NUMBER) RETURN NUMBER IS val_inss NUMBER(15.2) := &1.9999 LOOP msg := SQLERRM (num * -1). SUBPROGRAMAS Subprogramas são blocos PL/SQL com nome. END.: DECLARE msg CHAR(100) BEGIN FOR num IN 1. SQLERRM String procedure para traduzir um SQLCODE. Os subprogramas devem ser declarados no fim da parte declarativa.: DECLARE w_vl_lim NUMBER(15.. END LOOP. Os subprogramas podem ser definidos em qualquer ferramenta ORACLE que suporte PL/SQL. A exceção B se propaga para o bloco mais externo. … PROCEDURE calc_ir (val_sal IN NUMBER.__________________________________________________________________________________________ …A’ EXCEPTION WHEN B THEN … END. funções e packages. após todos os outros objetos do programa. o programa é abortado. os subprogramas possuem uma parte declarativa. Geralmente usa-se uma procedure para executar uma ação e uma função para calcular um valor. A PL/SQL possui dois tipos de subprogramas chamados procedures e funções. Podem ser declaradas dentro de blocos. FUNCTION calc_inss (val_sal IN NUMBER. • • • A exceção A é tratada no bloco mais interno. Após seu tratamento o programa continua no comando A.

30. exceto que as funções possuem uma cláusula RETURN que especifica o tipo de retorno da função. ELSE val_ir := val_sal *. ELSIF val_sal BETWEEN 1000. parâmetro possui a seguinte sintaxe: <nome da variável> [IN | OUT |IN OUT] <tipo> [{:= | DEFAULT} <valor>] Quando [IN | OUT …] não for especificado. ELSIF val_sal BETWENN 300. sintaxe: onde: PROCEDURE <nome da procedure> [(<parâmetro>[. Ex: PROCEDURE calc_ir (val_sal IN NUMBER. sintaxe: onde: FUNCTION <nome da função> [(<parâmetro>[. val_ir OUT NUMBER) IS BEGIN IF val_sal < 300.<parâmetro>.__________________________________________________________________________________________ BEGIN … END.…])] IS BEGIN <comandos> [EXCEPTION <tratamento das exceções>] END <nome da procedure>]. será assumido IN. será assumido IN. FUNCTIONS Uma função é um subprograma que calcula um valor.01 AND 3000.20.10. PROCEDURES As procedures são subprogramas que executam uma ação específica. Funções e procedures são estruturalmente iguais.01 AND 1000.00 THEN val_ir := val_sal * .…])] RETURN <tipo da função> IS [<variáveis locais>] BEGIN <comando> [EXCEPTION <tratamento das exceções>] END <nome da função>]. __________________________________________________________________________________________ 118 .00 THEN val_ir := val_sal *.00 THEN val_ir := 0.<parâmetro>. parâmetros possui a seguinte sintaxe: <nome da variável> [IN | OUT | IN OUT] <tipo> [{:=| DEFAULT} <valor>] Quando [IN | OUT …] não for especificado. END calc_ir.

IF val_inss > val_lim THEN val_inss := val_lim. No caso de recursividade.08. __________________________________________________________________________________________ 119 . PROCEDURE calc_ir (val_sal IN NUMBER. Esta declaração pode ser usada para: • • • definir subprogramas em ordem alfabética definir subprogramas recursivos grupar subprogramas dentro de packages Uma declaração forward consiste de uma declaração de subprograma terminada por um .. — declaração — forward FUNCTION calc_inss (val_sal IN NUMBER. END IF. DECLARAÇÕES FORWARD A PL/SQL exige que se declare um subprograma antes de chama-lo. RETURN val_inss. END calc_inss. val_ir OUT NUMBER). END calc_inss.: FUNCTION calc_inss (val_sal IN NUMBER. val_ir OUT NUMBER) IS BEGIN … END calc_ir. BEGIN … END. Ex: DECLARE w_vl_lim NUMBER(15.2).__________________________________________________________________________________________ Ex. A PL/SQL resolve este problema com uma declaração forward. BEGIN val_inss := val_sal * . porém isto não é possível. BEGIN … RETURN val_inss. val_lim IN NUMBER) RETURN NUMBER IS val_inss NUMBER(15.2). val_lim IN NUMBER) RETURN NUMBER IS val_inss NUMBER(15.2) := &1. … PROCEDURE calc_ir(val_sal IN NUMBER.

CREATE [OR REPLACE] FUNCTION <nome da função> [(<parâmetro>[. CHAMADAS DE UM STORED PROGRAM Local De outro subprograma De um programa de aplicação (HOST) De uma ferramenta ORACLE Sintaxe: <nome da procedure> (<parâmetro>…). END-EXEC. Por exemplo.<parâmetro>…])] RETURN <tipo da função> AS/IS [<variáveis locais>] BEGIN <comandos> [EXCEPTION <tratamento das exceções>] END <nome da função>]. __________________________________________________________________________________________ 120 . A sintaxe é semelhante à de um subprograma definido dentro de um programa PL/SQL. A utilização de librarys diminui a possibilidade de erros na codificação de rotinas de consistência.…])] AS/IS [<variáveis locais>] BEGIN <comandos> [EXCEPTION <tratamento das exceções>] END <nome da procedure>]. Subprogramas rem a vantagem de compartilhar memória. 10 calls são necessárias. porém para executar um subprograma contendo dez comandos SQL. apenas um call é necessário. EXECUTE <nome da procedure> (<parâmetro>…). uma vez que só há a necessidade de se efetuar a validação da rotina uma vez e ela poderá ser usada por qualquer número de aplicações. uma vez que o DBA pode restringir o acesso a determinadas operações. END.__________________________________________________________________________________________ STORED SUBPROGRAMS No ORACLE é possível armazenar um subprograma PL/SQL na base da dados após a compilação. CRIANDO UM STORED SUBPROGRAM sintaxe: CREATE [OR REPLACE] PROCEDURE <nome da procedure>[(<parâmetro>. Subprogramas podem reduzir a necessidade de calls nas aplicações. somente uma cópia de um subprograma necessita ser carregado na memória para execução por múltiplos usuários. Ou seja. Pode haver um aumento na segurança. (SQL*PLUS) ou BEGIN <nome da procedure> (<parâmetro>…). para executar 10 comandos SQL individuais. Várias vantagens são adquiridas com este procedimento. diminuindo a redundância de codificação. EXEC SQL EXECUTE BEGIN <nome da procedure> (<parâmetro)…). END. fornecendo autorização somente através de subprogramas. tais como: Produtividade Performance Memória Integridade Segurança Vários programas podem fazer rotinas previamente gravadas na base de dados.

<coluna>] [OR DELETE | INSERT | UPDATE [OF <coluna>[. DATABASE TRIGGERS Um DATABASE TRIGGER é um programa PL/SQL armazenado em um banco ORACLE. um de cada tipo (BEFORE UPDATE <row>. associado com uma tabela específica. BEFORE DELETE <comando> e as mesmas sintaxes para AFTER). BEFORE INSERT <row>. Deve-se observar que os DATABASE TRIGGERS executam com os privilégios do OWNER e não do usuário corrente. o trigger é disparado e um bloco PL/SQL “anônimo” executa a ação.<coluna>]…} ON <tabela> [REFERENCING {OLD [AS] <nome> | NEW [AS] <nome> [OLD [AS] <nome> | NEW [AS] <nome>]} FOR EACH ROW [WHEN (<condição>)]] <bloco PL/SQL/> __________________________________________________________________________________________ 121 . Um DATABASE TRIGGER é composto de 3 partes: • • • evento constraint (opcional) ação Quando o evento ocorre. sintaxe: CREATE [OR REPLACE] TRIGGER <nome trigger> {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF <coluna>[. BEFORE INSERT <comando>. BEFORE UPDATE <comando>. pode-se usar um DATABASE TRIGGER para: • • • • • Logar modificações garantir críticas complexas Gerar o valor de colunas Implementar níveis de segurança mais complexos Manter tabelas duplicadas Pode-se associar até 12 DATABASE TRIGGERS a cada tabela.__________________________________________________________________________________________ 12. O ORACLE irá disparar a execução do DATABASE TRIGGER automaticamente quando uma determinada operação SQL afeta a tabela. Deste forma. BEFORE DELETE <row>.

WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20999.: CREATE TRIGGER checa_salario BEFORE UPDATE OF vl_sal. negativo EXCEPTION. IF (:NEW. WHEN negativo THEN RAISE_APPLICATION_ERROR(-20230.vl_sal > salario_maximo) THEN RAISE faixa ELSIF (:NEW. MAX(vl_sal) INTO salario-minimo.vl_sal < OLD.vl_sal) THEN RAISE negativo.nr_git. salario_maximo NUMBER(5) := 0. ‘Salário fora da faixa’).1 * :OLD. WHEN excede THEN RAISE_APPLICATION_ERROR(-20235. SQLERRM(SQLCODE)). END IF.vl_sal < salario_minimo OR :NEW. ‘Incremento negativo’).nr_git < 56) DECLARE salario_minimo NUMBER(5) := 0. faixa EXCEPTION.__________________________________________________________________________________________ Ex.vl_sal > 1.vl_sal) THEN RAISE excede. ELSIF (:New. __________________________________________________________________________________________ 122 . END. EXCEPTION WHEN faixa THEN RAISE_APPLICATION_ERROR(-20225. salario_maximo FROM folha WHERE nr_git = :new. BEGIN SELECT MIN(vl_sal). nr_git ON FUNC FOR EACH ROW WHEN (NEW. excede EXCEPTION. ‘Incremento excede 10%’).

No corpo do pacote é concluída a definição dos cursores e subprogramas e feita a implementação da especificação. variáveis. PACKAGES Um package é um objeto que grupa logicamente subprogramas. sintaxe: CREATE [OR REPLACE] PACKAGE <nome do pacote> AS/IS <declarações> END <nome do pacote> CREATE [OR REPLACE] PACKAGE BODY <nome do pacote> AS/IS <corpo dos subprogramas< [BEGIN <inicializações>] END <nome do pacote> __________________________________________________________________________________________ 123 . Packages são compostos de duas partes: A especificação e o corpo do pacote. Um package não pode ser chamado.__________________________________________________________________________________________ 13. cursores e subprogramas. exceções. objetos e tipos PL/SQL. Nela são declarados os tipos. 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: PACKAGE <nome do pacote> IS <declarações> END [<nome do pacote>]. O corpo implementa detalhes e declarações privadas que são invisíveis pelas aplicações. — parte da especificação PACKAGE BODY <nome do pacote> IS <corpo dos subprogramas> [BEGIN <comandos de inicialização>] END [<nome do pacote>]. O corpo seria uma caixa preta. constantes. A especificação é a interface com as aplicações. — corpo do pacote A parte de especificação são declarações públicas. receber parâmetro nem ser aninhado (declarado dentro de outro package). visíveis pelas aplicações.

subsequentes chamadas a outros subprogramas dentro do pacote não requerem I/O de disco __________________________________________________________________________________________ 124 . END funcinario. END demissão. CURSOR salario (mat NUMBER) RETURN func_reg_type. Variáveis públicas e cursores empacotados podem ser compartilhados por todas as procedures que executarem no ambiente. vl_sal FROM func WHERE cd_mat = mat ORDER BY vl_sal DESC.__________________________________________________________________________________________ Ex: CREATE PACKAGE funcionario AS TYPE func_reg_type IS RECORD )cd_depto_mat NUMBER. tudo que á necessário inicialmente é a informação da especificação do package. PROCEDURE admissão (nome CHAR. PROCEDURE demissão (mat NUMBER). sal NUMBER. nr_git. 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 várias vantagens: Modularidade Desenho da aplicação Segurança Funcionalidade Performance Packages permitem que se encapsule logicamente tipos. vl_sal. Já os privados são totalmente especificados do body do package. Os públicos são especificados na parte de especificação dos packages. Detalhes da implementação que se localizam do body são invisíveis e inacessíveis. Eles são usados dentro do próprio pacote e não precisam ficar visíveis a quem usar os pacotes. depto CHAR) IS BEGIN INSERT INTO func (nm_func. todo o pacote é carregado na memória. grau NUMBER. objetos e subprogramas são públicos ou privados. Assim. Com pacotes pode-se especificar que tipos. END funcionario. Uma vez que armazenado a referência ao pacote pode ser compilada também. quando uma aplicação é desenhada. Quando é feita a primeira chamada de um package subprogram pela primeira vez. END admissão. cd_depto) VALUES (nome. cd_mat_seq. depto CHAR). PROCEDURE admissão (nome CHAR.NEXTVAL. Deve-se observar que somente a especificação do pacote é visível e acessível pela aplicação. cd_mat. vl_sal NUMBER). CREATE PACKAGE BODY funcionario As CURSOR salario (mat NUMBER) RETURN func_reg_type IS SELECT cd_mat. PROCEDURE demissão (mat NUMBER) IS BEGIN DELETE FROM func WHERE cd_mat = mat. grau NUMBER. Pode se codificar e compilar a especificação sem o corpo do package. depto). sal NUMBER. sal. grau. objetos e subprogramas relacionados.

MENSAGENS EM STORED PROCEDURES E TRIGGERS Podemos enviar mensagens a partir de procedures ou packag’s usando package DBMS_OUTPUT. <subprograma> Pode-se fazer referência a pacotes de dentro de database triggers. <tipo> <nome de package>. Este package pode ser especialmente útil para depuração. agora cada uma das procedures e funções contidas no package DBMS_OUTPUT: DISABLE PROCEDURE Esta procedure desabilita as chamadas para PUT. NEW_LINE. Esta rotina não é necessária se estivermos usando a opção SERVER UOTPUT no SQL*PLUS ou SQL*DBA. para executar o trigger e depurar as mensagens incluídas. Estas mensagens poderão 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. que farão com que a mensagem seja armazenada em um buffer que pode ser mostrado quando o trigger. caso contrário estas mensagens serão ignoradas. stored subprograms e blocos PL/SQL dentro de programas e blocos PL/SQL anônimos.col). sintaxe: DISABLE. PUT_LINE. Devemos usar o SQL*PLUS ou SQL*DBA com a opção SERVER UOTPUT setada para ON. __________________________________________________________________________________________ 125 . EXEMPLO Suponha que desejássemos depurar um trigger. na primeira vez que for feita referência ao package (por sessão). GET_LINE e GET_LINES e limpa o buffer.PUT_LINE (‘O novo valor é’||:new. A inicialização da parte executável do package é feita uma única vez. Este package possui duas procedures PUT e PUT_LINE. Neste caso devemos incluir uma ou mais linhas de mensagens. <objeto> <nome de package>. 14. PROCEDURES E FUNÇÕES Veremos. objetos e subprogramas declaradas dentro da especificação de packages deve-se usar a seguinte notação: <nome de package>. da seguinte forma: DBMS_OUTPUT. procedure ou package for executado.__________________________________________________________________________________________ REFERÊNCIAS A PACKAGES Para fazer uma referência aos tipos.

GET_LINE PROCEDURE Esta procedure recupera uma linha da informação do buffer. Deve-se especificar a quantidade de informação (em bytes) as ser armazenada no buffer. caso contrário é 1 (não existem linhas no buffer). sintaxe: NEW_LINE. Após recuperar o número de linhas especificado. significa que não existem mais linhas no buffer. Não é necessária a chamda a esta procedure quando utilizamos a opção SQL*DBA ou SQL*PLUS. Sntaxe: GET_LINES (lines out chararr. sintaxe: GET_LINE(line out varchar2. Cada linha no array pode ter até 255 bytes de comprimento. status out integer). o status retornado é zero. numlines in out integer). As chamadas a estas procedures são ignoradas se o package DBMS_OUTPUT não estiver habilitado. é o maior valor dentre os especificados. O tamanho máximo da linha é 255 bytes. PUT_LINE ou NEW_LINE. Cada chamada a NEW_LINE gerará uma linha a ser retornada pelo GET_LINE. para indicar fim de mensagem. NEW_LINE. a procedure retorna o número de linhas realmente recuperado. PUT_LINE. GET_LINES PROCEDURE Esta procedure recupera um array de linhas e pode ser usada no lugar de GET_LINE para reduzir o número de chamadas ao servidor. sintaxe: ENABLE (buffer_size in integer). O tamanho máximo é 1. receberemos a seguinte mensagem de erro: -20000. Todas as linhas não recuperadas serão descartadas quando usadas as procedures PUT. Se o buffer for excedido.000 bytes. NEW_LINE PROCEDURE Esta procedure coloca uma marca de fim da linha no buffer. excluindo o caracter newline final. ORU-10027: buffer overflow.000 e o mínimo é 2. Devemos especificar o número de linhas que desejamos recuperar do buffer.__________________________________________________________________________________________ ENABLE PROCEDURE Esta procedure habilita chamadas para PUT. GET_LINE e GET_LINES. Todas as linhas não recuperadas serão descartadas quando usadas as procedures PUT. PU_LINR ou NEW_LINE. Se este número for menor que o número de linhas requisitado. limit of buffer_limit bytes. __________________________________________________________________________________________ 126 . Se a procedure concluir com sucesso. Se existirem múltiplas chamadas a esta procedure.000. São permitidas múltiplas chamadas à ENABLE. Normalmente usamos esta procedure após uma ou mais chamadas à procedure PUT.

usado para depuração de stored procedures e tringgers. salário = ‘|| TO_CHAR(v_conta_sal)). v_total_sal NUMBER(11. END LOOP. será recebido uma mensagem de erro. As procedures GET_LINE e GET_LINES não retornam uma linha que não tenham sido terminadas com o caracter newline. func_rec func_cursor%ROWTYPE. PUT_LINE (‘Total de salários = ‘|| TO_CHAR(v_total_sal)). RETURN v_total_sal.: Se passarmos como parâmetro um number ou date. Cada chamada a PUT_LINE gera uma linha a ser recuperada pela procedure GET_LINE. Esta procedure armazena. v_conta := v_conta + 1. Se o tamanho especificado pelo buffer for excedido.2) := 0. devemos passar o parâmetro já convertido (VARCHAR2). BEGIN FOR func_rec IN func_cursor LOOP v_total_sal := v_total_sal + func_rec. PUT_LINE Esta procedure especifica a informação que desejamos armazenar no buffer. Obs. Se desejarmos um formato particular. __________________________________________________________________________________________ 127 .vl_sal. PUT_LINE (‘loop NO. um caracter de fim de linha a cada texto enviado. EXEMPLO O package DBMS_OUTPUT é. Sintaxe: PUT (item varchar2 | number | date). quando o item for recuperado será convertido (com TO_CHAR) para string no formato default. = ‘ || TO_CHARY(v_conta) || ‘. automaticamente.__________________________________________________________________________________________ PUT PROCEDURE Esta procedure especifica a informação que desejamos armazenar no buffer. v_conta NUMBER(10) := 1. END depto_sal. normalmente. Devemos usar esta procedure para adicionar pedaços de informação ao buffer. 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.