Professional Documents
Culture Documents
PL/SQL
Banco de Dados II
Engenharia da Computao
D
I
N
O
Linguagens hospedeiras
Aplicaes
PL/SQL
Oracle
Introduo bsica
interrogar a BD
tomar decises
dialogar com o utilizador
etc.
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Comunicao
ODBC
JDBC
dados locais
BD
aplicao
PL/SQL - 3
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Assim
chamadas
DML
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - Ambiente
PL/SQL
Desenvolvimento modular de
programas.
Permite executar instrues
condicionais.
Permite executar instrues num ciclo.
Permite processar vrias linhas
devolvidas por uma pergunta atravs de
cursores.
Os erros podem ser processados com
rotinas de tratamento de excees.
Sintaxe:
Engine PL/SQL
PL/SQL
Block
PL/SQL
PL/SQL
Block
SQL
Execuo da
expresso
procedimental
Declare
ooo
Begin
ooo
Exception
ooo
End;
Servidor Oracle
Begin <lgica>
Declare <declarao de
variveis>
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 5
End
;
Exception <tratamento de
erros>
PL/SQL - 6
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Linguagem PL/SQL
Modularidade
PL/SQL - 7
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Benefcios da PL/SQL
PL/SQL - 8
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Arquitetura
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 9
Benefcios da PL/SQL
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 11
PL/SQL - 10
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Benefcios da PL/SQL
PERFORMANCE
A PL/SQL pode:
PL/SQL - 12
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Benefcios da PL/SQL
Benefcios da PL/SQL
PRODUTIVIDADE
PORTABILIDADE
PL/SQL - 13
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Identificadores da Linguagem
D
I
N
O
D
I
N
O
Dino Spoto
PL/SQL - 17
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Comentrios
Tpicos_Especiais1 - PL-SQL
PALAVRAS RESERVADAS
PL/SQL - 15
Tpicos_Especiais1 - PL-SQL
PL/SQL - 14
Tpicos_Especiais1 - PL-SQL
Comentrios - Exemplo
Listagem L03_04 - Comentrios
SQL> DECLARE
2
VALOR
VARCHAR2(10);
3
END_CASA
VARCHAR2(20);
4 BEGIN
5 VALOR := -- A atribuio ser feita na outra linha
6
'RUA A';
7 END_CASA := /* a atribuio vir a seguir */ 'RUA B S/N';
8 END;
9 /
PL/SQL - 18
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
FINAL DE LINHA
D
I
N
O
DECLARE
... definio dos objetos PL/SQL que sero
utilizados neste bloco
BEGIN
.... aes executveis
EXCEPTION
.... o que fazer se um ao executada causar
um erro
END;
PL/SQL - 19
Tpicos_Especiais1 - PL-SQL
Bloco Annimo
PL/SQL - 20
Tpicos_Especiais1 - PL-SQL
Declarao e atribuio
Sintaxe:
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
1.
Exemplos:
Declare
v_hiredate
DATE;
v_deptno NUMBER(2) NOT NULL :=10;
c_comm CONSTANT NUMBER :=1400;
v_ename emp.ename%TYPE;
Atribuio:
v_hiredate := 31-DEC-98;
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Dino Spoto
2.
3.
4.
5.
PL/SQL - 21
Number
Tipo de dado numrico para armazenamento de
valores fixos ou em ponto flutuante com preciso
de at 38 dgitos e magnitude de 1.0E-130 a
9.99E125.
Pode-se especificar preciso e escala. Se no
especificarmos preciso, o default 38 (ou o
maior tamanho vlido para o sistema operacional,
o que for menor).
Escala pode variar de 84 a 127. Escalas
negativas causam o arredondamento da parte
inteira.
Tpicos_Especiais1 - PL-SQL
1.
2.
ESCALARES
PL/SQL - 23
D
I
N
O
TIPOS DE DADOS
Listagem L03_06 Tipo de dado - Number
SQL> VARIABLE P1 NUMBER
SQL> VARIABLE P2 NUMBER
SQL> VARIABLE P3 NUMBER
SQL> DECLARE
2 WNUM1
NUMBER;
3 WNUM2
NUMBER(38, -4);
4 WNUM3
NUMBER(38, 127);
5 BEGIN
6 WNUM1 := 9.99E125;
7 WNUM2 := 38925;
8 WNUM3 := 123456789987654321.0E-130;
9 :P1 := WNUM1;
10 :P2 := WNUM2;
11 :P3 := WNUM3;
12 END;
13 /
Procedimento
sucesso.
PL/SQL
concludo
SQL> PRINT
P1
---------9,990E+125
P2
---------40000
P3
---------1,235E-113
PL/SQL - 24
Tpicos_Especiais1 - PL-SQL
com
UNIVEM
D
I
N
O
PL/SQL
Tpicos_Especiais1 - PL-SQL
Dino Spoto
3.
Pls_Integer
Tipo de dado numrico para armazenamento de inteiros vlidos no
seguinte intervalo de valores: de 231 + 1 (-2.147.483.647) e 231 1
(2.147.483.647).
similar ao tipo Binary_Integer, porm mais rpido para efetuar
clculos que um Binary_Integer ou um Number, pois utiliza machine
arithmetic, enquanto os demais usam library arithmetic.
Possui uma outra diferena em relao ao Binary_Integer no que se
refere deteco de Overflow. Quando efetuamos um clculo usando
variveis Pls_Integer e o valor ultrapassa a capacidade mxima da
varivel, ocorre um erro de Overflow mesmo que a rea receptora tenha
capacidade de armazenamento (seja um Number, por exemplo).
J com Binary_Integer no ocorrer qualquer erro se atribuirmos o
resultado a um Number.
PL/SQL - 27
A recomendao da
Oracle que
passemos a utilizar
variveis do tipo
Pls_Integer nas
novas aplicaes
para que possamos
obter ganhos de
performance
PL/SQL - 29
PL/SQL - 28
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo - Pls_Integer
concludo
PL/SQL - 26
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Comentrios - Number
D
I
N
O
PL/SQL - 25
Tpicos_Especiais1 - PL-SQL
Outro Exemplo
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Comentrios - Number
Char
Tipo de dado alfanumrico de tamanho fixo com comprimento de at
32.767 bytes. Pode-se especificar o tamanho mximo na declarao de
uma varivel com esse tipo. Caso isso no seja especificado, o
comprimento default de 1 byte.
O comprimento especificado em bytes e no em caracteres. Isso
importante quando armazenamos valores multibytes.
O conjunto de valores vlidos para armazenamento depende do charset
do banco de dados.
A definio de uma coluna do tipo Char no banco de dados est
limitada a 2.000 bytes.
O tipo Char tem um nico subtipo Character que possui as mesmas
caractersticas de seu tipo bsico.
PL/SQL - 30
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Exemplo - Char
Listagem L03_09 Tipo de dado - CHAR
SQL> VARIABLE P1 VARCHAR2(100)
SQL> DECLARE
2 WCHAR
CHAR(5);
3 BEGIN
4 WCHAR := 'ABC';
5 :P1 := '*'||WCHAR||'*';
6 END;
7 /
Procedimento PL/SQL concludo com sucesso.
5.
SQL> PRINT P1
P1
-----------------------------*ABC *
Na listagem L03_09,
possvel observar que a
varivel foi completada com
brancos direita at atingir o
comprimento especificado
pelo tipo.
PL/SQL - 31
Tpicos_Especiais1 - PL-SQL
D
I
N
O
6.
P1
---------------------------*ABC*
D
I
N
O
PL/SQL - 33
Tipos de Dados
SQL> PRINT P1
P1
-------------------------------8.
*ABC*
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 35
PL/SQL - 34
Tpicos_Especiais1 - PL-SQL
7.
Long
Tipo de dado alfanumrico de tamanho varivel
com comprimento de at 32.767 bytes. Podemos
especificar o tamanho mximo na declarao de
uma varivel com esse tipo.
Uma coluna Long no banco de dados armazena at
2 GB (2.147.483.647 bytes).
Podemos fazer referncia a colunas Long em
comandos de DML (Insert, Update e muitos
comandos Select), mas no em expresses,
chamadas de funes SQL, ou em certas clusulas,
tais como Where, Group By e Connect By.
D
I
N
O
Exemplo - Long
PL/SQL - 32
Tpicos_Especiais1 - PL-SQL
SQL> PRINT P1
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo Varchar2
Listagem L03_10 Tipo de dado Varchar2
SQL> DECLARE
2 WVARCHAR2
VARCHAR2(32767);
3 WVARCHAR
VARCHAR(100);
4 BEGIN
5 WVARCHAR2 := 'ABC';
6 WVARCHAR := WVARCHAR2;
7 :P1
:= '*'||WVARCHAR||'*';
8 END;
9 /
Varchar2
Raw
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767.
A especificao de tamanho na declarao de uma varivel com esse tipo
obrigatria. So semelhantes a colunas Varchar2, porm a PL/SQL no
interpreta seu contedo. Uma coluna Raw no banco de dados armazena at
2.000 bytes.
Long Raw
Tipo de dado binrio de tamanho varivel com comprimento de at 32.767.
A especificao de tamanho na declarao de uma varivel com esse tipo
obrigatria. So semelhantes a colunas Long, porm a PL/SQL no
interpreta seu contedo.
Uma coluna Long Raw no banco de dados armazena at 2 GB
(2.147.483.647).
Rowid
Para armazenamento de valores Rowid do banco de dados. Cada tabela
criada no banco de dados possui uma pseudocoluna Rowid que armazena
valores hexadecimais que correspondem ao endereo de cada linha (row).
PL/SQL - 36
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Exemplo - Rowid
Listagem L03_12 Tipo de dado - Rowid
SQL> SELECT CD_MAT, ROWID FROM FUNC
2 WHERE ROWNUM < 10;
10.
D
I
N
O
Nchar
Tipo de dado alfanumrico de tamanho fixo com comprimento de at 32.767
bytes. Podemos especificar o tamanho mximo na declarao de uma varivel
com este tipo. Caso isso no seja especificado, o comprimento default de 1
byte.
9 linhas
selecionadas.
Tpicos_Especiais1
- PL-SQL
Urowid
Armazena um Rowid lgico. Usado para captura do Rowid (lgico) de tabelas
Index Organized.
Tipos de Dados
Nvarchar2
Tipo de dado alfanumrico de tamanho varivel com comprimento de at
32.767 bytes. A especificao de tamanho obrigatria para uma varivel
declarada com este tipo
13.
Boolean
um tipo de dados para variveis (no podem ser definidas como colunas em
uma base de dados). Armazena valores lgicos True e False e a ausncia de
valor Null. No possui tamanho e nem qualquer tipo de parmetro.
PL/SQL - 37
D
I
N
O
PL/SQL - 38
Tpicos_Especiais1 - PL-SQL
Exemplo - Date
SQL> PRINT P1
14.
Date
Tipo de dado para armazenamento de valores de data e hora. Os valores
variam de 01 de janeiro de 4712 A.C. at 31 de dezembro de 9999 D.C.
Na definio de uma varivel de tipo data, no especificamos
comprimento.
Podemos operar com variveis tipo data (da mesma forma que com
colunas Date) adicionando ou subtraindo valores inteiros, usando as
funes de SQL para data e subtraindo duas datas para obter o intervalo de
dias.
Quando associamos uma data a uma varivel alfanumrica, ocorre a
converso automtica de tipo, da mesma forma que ocorre quando
associamos uma varivel alfanumrica a uma varivel de data. O layout
default para a converso depende do valor de Nls_Date_Format em vigor
para a sesso.
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 39
16.
17.
18.
19.
Timestamp
Extenso do tipo Date. Ano, ms e dia assim com hora, minuto, segundo e frao
de segundo. Podemos indicar o nmero de dgitos da parte fracionria do segundo.
Timestamp With Time Zone
Extenso ao tipo Timestamp. Inclui a apresentao da zona de tempo. Onde a zona
de tempo corresponde diferena (entre horas e minutos) entre a hora local e UTC
(hora de Greenwich).
Timestamp With Local Time Zone
Extenso ao tipo Timestamp. A diferena entre esta opo e a anterior que a zona
de tempo no armazenada no banco de dados. O dado, quando armazenado,
normalizado para Dbtimezone e, quando recuperado, visualizado pelo usurio
com a Time Zone da sesso (ocorre uma segunda converso).
Interval Day to Second
Armazena um perodo de tempo em dias, horas, minutos e segundos.
Interval Year to Month
Armazena um perodo de tempo em anos e meses.
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 41
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exerccio - Datas
Listagem L03_14 Tipo de dado - Datas
SQL> VARIABLE P1 VARCHAR2(1000)
SQL> VARIABLE P2 VARCHAR2(1000)
SQL> DECLARE
2 WTM
TIMESTAMP := CURRENT_TIMESTAMP;
3 WTM_TZ TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
4 WTM_LTZ TIMESTAMP WITH LOCAL TIME ZONE :=
LOCALTIMESTAMP;
5
IDS
INTERVAL DAY TO SECOND := NUMTODSINTERVAL
(1125.3, 'MINUTE');
6
IYM
INTERVAL YEAR TO MONTH := NUMTOYMINTERVAL
(25.3, 'MONTH');
7 BEGIN
8 :P1 := WTM||' | '||WTM_TZ||' | '||WTM_LTZ;
9 :P2 := IDS||' | '||IYM;
10 END;
11 /
Procedimento PL/SQL concludo com sucesso.
PL/SQL - 42
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Exemplo
SQL> PRINT P1
20.
P1 (WTM )
(WTM_TZ )
(WTM_LTZ)
-------------------------------------------------------------------------------22/08/03 20:00:59,328000 | 22/08/03 20:00:59,390000 -03:00 | 22/08/03 20:00:59,4
06000
PL/SQL - 43
Tpicos_Especiais1 - PL-SQL
D
I
N
O
22.
23.
24.
Blob
O tipo Blob tem a capacidade de armazenar grandes valores binrios. O tamanho mximo no
pode exceder 4 GB. O armazenamento da informao pode ser feito na prpria linha ou em
outro espao especfico.
Clob
O tipo Clob tem a capacidade de armazenar grandes volumes de dados alfanumricos singlebyte. O tamanho mximo no pode exceder 4 GB. O armazenamento da informao pode ser
feito na prpria linha ou em outro espao especfico.
Nclob
O tipo Nclob tem a capacidade de armazenar grandes volumes de dados alfanumricos singlebyte ou multibyte do tipo Nchar. O tamanho mximo no pode exceder 4 GB. O
armazenamento da informao pode ser feito na prpria linha ou em outro espao especfico.
Bfile
O tipo Bfile tem a capacidade de armazenar grandes volumes de dados binrios fora do banco
de dados. O locator de um Bfile inclui um diretrio que especifica o caminho completo do
arquivo no servidor. O arquivo endereado por um Bfile fica fora do banco de dados. No banco
de dados, armazenamos apenas um locator (endereo) para o arquivo. O tamanho do arquivo
no pode exceder 4 GB
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 45
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 47
PL/SQL - 46
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 44
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Tipos de Dados
21.
Lobs
So conjuntos de tipos de dados predefinidos e que armazenam valores
chamados locators, os quais especificam a localizao dos lobs (large
objects) armazenados na linha ou fora dela.
Armazenam valores com comprimento de at 4 GB. Permitem o acesso
randmico a trechos do dado.
So diferentes dos tipos Long e Long Raw nos seguintes aspectos:
- Podem ser atributos (exceto Nclob) de tipos objeto, Longs no podem.
- O comprimento mximo de 4 GB e o dos Longs 2 GB.
- Lobs suportam acesso randmico, enquanto Longs suportam somente
acesso seqencial.
- Pode-se declarar diversas colunas Lob em uma mesma tabela; Longs
no so permitidos (somente 1).
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Subtipos - Exemplos
Podemos definir subtipos de um tipo bsico e, posteriormente, uma
varivel com aquele tipo. As restries estabelecidas para o subtipo devem
ser respeitadas pelo item (veja Listagem L03_16).
Listagem 3.16 Subtipo
SQL> DECLARE
DECLARE
2 SUBTYPE DATA IS DATE NOT NULL;
*
3 SUBTYPE TEXTO IS VARCHAR2(100);
ERRO na linha 1:
4 SUBTYPE CODIGO IS NUMBER(5);
ORA-06502:
PL/SQL:
5 DT_HOJE
DATA := SYSDATE;
erro: preciso de nmero
TEXTO(100);
6 DESCRICAO
grande demais numrico
7 CD_MAT
CODIGO(5);
ou de valor
8 BEGIN
ORA-06512: em line 11
9 DT_HOJE := SYSDATE;
10 DESCRICAO := 'TESTE DE SUBTIPO';
11 CD_MAT := 123456;
12 :P1
:= DESCRICAO||'-'||CD_MAT||'-'||DT_HOJE;
13 END;
14 /
D
I
N
O
B_Integer
Blob
BInteger
Char
CLOB
Date
Long
Number
P_Integer
Blob
Char
D
I
N
O
Raw
Urowid
S
S
Date
Long
P_Integer
S
S
S
S
S
S
PL/SQL - 51
Tpicos_Especiais1 - PL-SQL
D
I
N
O
S
S
Urowid
Number
Raw
PL/SQL - 50
PL/SQL - 52
Tpicos_Especiais1 - PL-SQL
D
I
N
O
DECLARAES
Varchar2
CLOB
Varchar2
Tpicos_Especiais1 - PL-SQL
Tipo
PL/SQL - 49
Tpicos_Especiais1 - PL-SQL
CONVERSO IMPLCITA
Exemplos Declaraes
Listagem L03_18 Declarao de varivel
SQL> DECLARE
2 ZERO
CONSTANT NUMBER(1) DEFAULT 0;
3 NULO
CONSTANT NUMBER(1) := 0;
4 V_COD
NUMBER(4)
:= 0;
5 V_TEXTO VARCHAR2(100);
6 V_DATA DATE NOT NULL := SYSDATE;
7 BEGIN
8 V_COD := ZERO;
9 END;
10 /
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 53
PL/SQL - 54
Tpicos_Especiais1 - PL-SQL
UNIVEM
D
I
N
O
PL/SQL
PL/SQL - 55
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo
Procedimento
PL/SQL
concludo com sucesso.
Tpicos_Especiais1
- PL-SQL
Dino Spoto
MSG
-----------------------------WCHAR INTERNA-15
PL/SQL - 59
PL/SQL - 58
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 56
ESCOPO DE VISIBILIDADE
PL/SQL - 57
Exemplo - Visibilidade
D
I
N
O
%TYPE
Tupla da Tabela
Campo da Tabela
D
I
N
O
D
I
N
O
Exemplos - Visibilidade
Na listagem L03_21 a seguir, fizemos referncia varivel wtotal no bloco principal e
recebemos um erro indicando que neste bloco no havia sido declarada nenhuma
varivel wtotal. Esta varivel deixou de existir quando passamos pelo End ou subbloco.
Listagem L03_21 Declarao de varivel
SQL> DECLARE
2 WNUM
NUMBER := 12;
3 WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4 WUNICO
NUMBER
:= 5;
WTOTAL := WTOTAL + 1;
5 BEGIN
*
6 DECLARE
7
WNUM
NUMBER
:= 10;
ERRO na linha 14:
8
WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
ORA-06550: linha 14, coluna 3:
9
WTOTAL
NUMBER;
PLS-00201: o identificador 'WTOTAL'
10 BEGIN
deve ser declarado
11 WTOTAL := WNUM + WUNICO;
ORA-06550: linha 14, coluna 3:
12 :MSG := WCHAR||'-'||WTOTAL;
PL/SQL: Statement ignored
13 END; - - Acaba o escopo da varivel WTOTAL
14 WTOTAL := WTOTAL + 1;
15 Tpicos_Especiais1
END;
- PL-SQL
PL/SQL - 60
16 /
10
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
QUALIFICAO
Para controlarmos a visibilidade e termos acesso s variveis
dos blocos de nvel superior, devemos qualificar qualquer
referncia s variveis externas nos blocos internos.
Listagem L03_22 Qualificao
RESTRIES
SQL> BEGIN
2 <<EXT>>
3 DECLARE
4 WCOD
NUMBER := 1;
5 BEGIN
6 DECLARE
7
WCOD
NUMBER:= 5;
8 BEGIN
9
IF WCOD <> EXT.WCOD THEN
10
:MSG := 'DIFERENTE';
11
ELSE
12
:MSG := 'IGUAL';
13
END IF;
14 END;
15 END;
16 END;
17 /
MSG
---------------------------DIFERENTE
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Atribuio
PL/SQL - 62
WB1 := 1;
*
ERRO na linha 6:
ORA-06550: linha 6, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 6, coluna 3:
PL/SQL: Statement ignored
ORA-06550: linha 7, coluna 10:
PLS-00382: a expresso do tipo incorreto
ORA-06550: linha 7, coluna 3:
PL/SQL: Statement ignored
PL/SQL - 64
Tpicos_Especiais1 - PL-SQL
D
I
N
O
COMANDOS BSICOS
*
ERRO na linha 2:
Tpicos_Especiais1 - PL-SQL
NUMBER := WVAL + 1;
D
I
N
O
WCOD
Exemplo de Atribuio
Listagem L03_26 Atribuio
SQL> VARIABLE RETORNO NUMBER
SQL> DECLARE
2 V1
NUMBER := 1;
3 V2
NUMBER;
4 BEGIN
5 V1 := V1 + V2;
6 :RETORNO := V1 * 2;
7 END;
8 /
O resultado do
programa
apresentado pela
Listagem L03_26
foi Null,
Dino Spoto
PL/SQL - 65
PL/SQL - 66
Tpicos_Especiais1 - PL-SQL
11
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Comandos
IF
Sintaxe 3.03 IF
IF (CONDIO) THEN [CORPO DE COMANDOS] END
IF;
IF (CONDIO) THEN [CORPO DE COMANDOS]
ELSE/[ELSEIF] [CORPO DE COMANDOS DO ELSE]
END IF;
PL/SQL - 67
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Exemplos
If Var1 > 10 then
Var2 = Var1 + 20 ;
End If ;
If Not ( Var1 < = 10 )
then
Var2 = Var1 + 20 ;
End If ;
D
I
N
O
PL/SQL - 70
SELECT INTO
Dentro da PL/SQL, o comando Select ganha a clusula Into
a fim de obter dados da linha lida para variveis do
programa. Desta forma, poderemos manusear os dados
obtidos.
A clusula Into segue imediatamente a lista de variveis da
clusula Select e precede a clusula From.
Devemos informar uma rea de recepo capaz de
comportar todos os dados lidos; caso contrrio, receberemos
erro na execuo.
O comando Select Into somente faz leitura de uma linha.
Caso venhamos a selecionar mais de uma linha usando este
comando, ocorrer um erro (To Many Rows) indicando o
excesso. A leitura de diversas linhas feita com o uso do
cursor.
begin
update FUNC set
VL_SAL=240
where VL_SAL<200;
if SQL%FOUND then
commit;
else
dbms_output.put_line('Valores nao Encontrados');
end if;
end;
/
Dino Spoto
Tpicos_Especiais1 - PL-SQL
D
I
N
O
IF - %FOUND
Tpicos_Especiais1 - PL-SQL
Exerccio - IF
Listagem L03_27 IF
SQL> VARIABLE MSG VARCHAR2(100)
SQL> DECLARE
2 VALOR
NUMBER := &VAL;
3 BEGIN
4 IF VALOR > 0 THEN
5
:MSG := 'Valor maior que zero';
6 ELSIF VALOR = 0 THEN
7
:MSG := 'Valor igual a zero';
8 ELSE
9
:MSG := 'Valor menor que zero';
10 END IF;
11 END;
12 /
Tpicos_Especiais1 - PL-SQL
PL/SQL - 68
Tpicos_Especiais1 - PL-SQL
PL/SQL - 71
PL/SQL - 72
Tpicos_Especiais1 - PL-SQL
12
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
D
I
N
O
Procedimento
PL/SQL
concludo com sucesso.
MSG
-----------------------------Salrio Ant =
Salrio Atual =
2700,0
2907,2
PL/SQL - 73
PL/SQL - 74
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo - Goto
Listagem L03_29 Goto
SQL> DECLARE
2 CONTA
NUMBER := 0;
3 BEGIN
4 <<INICIO>>
5 CONTA := CONTA + 1;
6 IF CONTA < 5 THEN
7
GOTO INICIO;
8 END IF;
9 END;
10 /
GOTO
Restries - Goto
Existem algumas situaes em que o comando Goto no pode
ser usado:
- - Desvio para dentro de um IF ou Loop (GoTo Prximo_IF).
- - Desvio para dentro de um sub-bloco (GoTo subbloco).
- - Desvio para fora de um subprograma (GoTo Para_Fora).
- Desvio para dentro de um bloco a partir da rea de exceo
(GoTo Incio).
Na Listagem L03_29,
Label
aparece
um
(incio) que deve ser
codificado entre <<e>>.
No comando Goto, os
smbolos (<<e>>) no
devem ser usados.
PL/SQL - 75
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Dino Spoto
D
I
N
O
NULL
GOTO PROXIMO_IF;
*
ERRO na linha 9:
ORA-06550: linha 9, coluna 7:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'PROXIMO_IF'
ORA-06550: linha 11, coluna 13:
PL/SQL: Statement ignored
ORA-06550: linha 4, coluna 5:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'PARA_FORA'
ORA-06550: linha 6, coluna 1:
PL/SQL: Statement ignored
ORA-06550: linha 22, coluna 5:
PLS-00375: instruo GOTO invlida;
este GOTO no pode ser
ramificado para o
label 'INICIO'
ORA-06550: linha 22, coluna 5:
PL/SQL: Statement ignored
PL/SQL - 76
Tpicos_Especiais1 - PL-SQL
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.
PL/SQL - 78
Tpicos_Especiais1 - PL-SQL
13
UNIVEM
D
I
N
O
D
I
N
O
Estruturas de controle
LOOP
FOR
WHILE
PL/SQL - 79
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Tpicos_Especiais1 - PL-SQL
D
I
N
O
DECLARE
Estruturas de controlo
Contador number(2) := 1;
BEGIN
LOOP
INSERT INTO itens( no_enc, linha )
values(v_num_enc, contador );
Contador:= contador+1;
Exit when contador >10;
End loop;
END;
Dino Spoto
Estruturas de controle
statement1;
Exemplo de ciclo
Tpicos_Especiais1 - PL-SQL
PL/SQL - 80
LOOP
PL/SQL - 81
Tpicos_Especiais1 - PL-SQL
Ciclos
D
I
N
O
PL/SQL
PL/SQL - 83
PL/SQL - 84
Tpicos_Especiais1 - PL-SQL
14
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
FOR - IN REVERSE
O comando FOR permite que controle o nmero de
vezes que as aoes foram repetidas e define quando
termina essa repetio.
FOR variavel_de_controle IN REVERSE ( menor_valor
.. maior_valor );
declare
x number;
begin
For x in 1..10
loop
dbms_output.put_line(x);
end loop;
end;
D
I
N
O
PL/SQL - 85
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Listagem: L03_73 a 79
DECLARE
TYPE TTABLE
IS TABLE
OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TTEXTO
TTABLE;
I
NUMBER := 0;
CURSOR C1
IS SELECT NM_FUNC FROM FUNC;
BEGIN
FOR RC1 IN C1 LOOP
I := I + 1;
TTEXTO(I) := RC1.NM_FUNC;
END LOOP;
:MSG := 'Quantidade de elementos lidos : '||TTEXTO.COUNT;
END;
/
PL/SQL - 87
Tpicos_Especiais1 - PL-SQL
Tipos de Blocos
Annimo
[DECLARE]
STORED PROCEDURE
PROCEDURE
FUNCTION
TRIGGERS
PL/SQL - 88
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Parte2
PL/SQL - 86
Tpicos_Especiais1 - PL-SQL
D
I
N
O
FOR - TYPE
While - condio
BEGIN
--statements
[EXCEPTION]
END;
Procedimento
PROCEDURE name
IS
Funo
[EXCEPTION]
FUNCTION name
RETURN datatype
IS
BEGIN
-- statements
RETURN value;
[EXCEPTION]
END;
END;
BEGIN
--statements
Dino Spoto
PL/SQL - 89
PL/SQL - 90
Tpicos_Especiais1 - PL-SQL
15
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Criando Procedures
D
I
N
O
PL/SQL - 91
Tpicos_Especiais1 - PL-SQL
PL/SQL - 92
Tpicos_Especiais1 - PL-SQL
D
I
N
O
ARGUMENTOS
Criando Procedures
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Out
Retornando um valor da procedure para o ambiente chamador
utilizando o argumento OUT
Devolver informaes sobre um funcionrio:
CREATE OR REPLACE PROCEDURE pesquisa_empregado
( v_emp_no
IN
emp.empno%TYPE,
v_emp_name
OUT
emp.ename%TYPE,
v_emp_sal
OUT
emp.sal%TYPE,
v_emp_comm
OUT
emp.comm%TYPE)
IS
BEGIN
SELECT ename, sal, comm
INTO v_emp_name, v_emp_sal, v_emp_comm
FROM emp
WHERE empno = v_emp_no;
END pesquisa_empregado;
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 94
Tpicos_Especiais1 - PL-SQL
IN OUT
Exemplo: Criando uma procedure com um argumento IN/OUT.
Transforme a seqncia de sete dgitos de um nmero para o formato
de nmero de telefone.
CREATE OR REPLACE PROCEDURE formata_telefone
(v_phone_no IN OUT varchar2)
IS
BEGIN
v_phone_no := SUBSTR (v_phone_no,1,3) || - ||
SUBSTR (v_phone_no,4,4);
END formata_telefone;
PL/SQL - 95
PL/SQL - 96
Tpicos_Especiais1 - PL-SQL
16
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Criando Funes
Sintaxe:
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
PL/SQL - 99
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 98
Exibindo a Funo:
PL/SQL - 100
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exception
declare
v_nome varchar2(30);
v_sal number(8,2);
begin
select NM_FUNC, VL_SAL
INTO v_nome, v_sal
From func
where CD_MAT=122;
dbms_output.put_line(v_nome||' '||v_sal);
exception
when no_data_found then
dbms_output.put_line('Funcionario nao Cadastrado');
end;
/
Exception - %TYPE
declare
v_nome FUNC.NM_FUNC%TYPE;
v_sal FUNC.VL_SAL%TYPE;
begin
select NM_FUNC, VL_SAL
INTO v_nome, v_sal
From FUNC;
dbms_output.put_line(v_nome||' '||v_sal);
exception
when no_data_found then
dbms_output.put_line('Funcionario nao Cadastrado');
when too_many_rows then
dbms_output.put_line('Retornou muitos registros');
end;
/
PL/SQL - 101
PL/SQL - 102
Tpicos_Especiais1 - PL-SQL
17
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Procedimentos
Funes
Sintaxe:
CREATE [OR REPLACE] PROCEDURE procedure_name
(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2, ...)
IS | AS
Criando Funes
Para criar uma funo ou procedure depender
de que forma ser chamada e de que forma
espera-se os valores.
Criar uma nova funo com o comando
CREATE FUNCTION, a qual declara uma
lista de argumentos, declara o argumento que
ir retornar e define as aes que sero
realizadas utilizando blocos PL/SQL.
PL/SQL Block
(v_id in emp.empno%TYPE)
IS
BEGIN
UPDATE emp
SET sal = sal * 1.1
WHERE empno = v_id;
END raise_salary;
/
Executar:
SQL> EXECUTE raise_salary (7369)
PL/SQL> raise_salary(7369)
PL/SQL - 103
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Sintaxe:
Exemplo:
PL/SQL - 105
Tpicos_Especiais1 - PL-SQL
Dino Spoto
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Funes
PL/SQL - 106
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Fazer as listagens
PL/SQL - 107
PL/SQL - 104
Tpicos_Especiais1 - PL-SQL
PL/SQL - 108
Tpicos_Especiais1 - PL-SQL
18
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 110
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 111
Tpicos_Especiais1 - PL-SQL
D
I
N
O
D
I
N
O
Exemplo
CREATE OR REPLACE PROCEDURE exclui_funcionario
(v_emp_no IN emp.empno%TYPE) IS
BEGIN
DELETE FROM EMP
WHERE empno = v_emp_no;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20200, Funcionario nao
existe);
END IF;
COMMIT WORK;
END exclui_funcionario;
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 113
PL/SQL - 112
Tpicos_Especiais1 - PL-SQL
Tpicos_Especiais1 - PL-SQL
19
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Exception_Init
PL/SQL - 115
Tpicos_Especiais1 - PL-SQL
D
I
N
O
DECLARE
v_empno NUMBER := 7654;
BEGIN
...
exclui_funcionario (v_empno);
...
END;
Executando de outra procedure.
D
I
N
O
PL/SQL - 119
PL/SQL - 118
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Dino Spoto
Execuo - Procedure
ProC ou OCI
Tpicos_Especiais1 - PL-SQL
PL/SQL - 116
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Execuo - Procedure
Exemplo
Java - JDBC
1.
2.
PL/SQL - 120
Tpicos_Especiais1 - PL-SQL
20
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Executando - Funo
Executando uma funo de um bloco PL/SQL
DECLARE
v_empno NUMBER := 7654;
v_sal NUMBER;
BEGIN
...
v_sal := pesquisa_salario(v_emp_no);
...
END;
Executando uma funo de uma procedure
CREATE PROCEDURE processa_emp (v_emp_no IN
emp.empno%TYPE) IS v_sal NUMBER;
BEGIN
...
v_sal := pesquisa_salario(v_emp_no);
...
END;
No SQL*Plus, o valor retornados de uma funo armazenado em
varivel global.
PL/SQL - 121
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 123
PRINT g_sal
PL/SQL - 122
Criando PACKAGES
Declarando construes pblicas dentro
da especificao do package.
PL/SQL - 124
Tpicos_Especiais1 - PL-SQL
Controle - Package
Dino Spoto
D
I
N
O
Exemplo
Tpicos_Especiais1 - PL-SQL
Sintaxe:
CREATE OR REPLACE PACKAGE
nome_do_package IS/AS
-- declaracao_de_variaveis --- declaracao_de_cursores --- declaracao_de_excessoes --- declaracao_de_procedures --- declaracao_de_funcoes -END nome_do_package
D
I
N
O
Tpicos_Especiais1 - PL-SQL
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Tratando as Funes e
Procedures
PL/SQL - 125
PL/SQL - 126
Tpicos_Especiais1 - PL-SQL
21
UNIVEM
D
I
N
O
PL/SQL
Exemplo Armazenando
Package
D
I
N
O
Executando Package
D
I
N
O
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 131
PL/SQL - 130
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Gatilhos
Executando Package
PL/SQL - 129
PL/SQL - 128
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo
D
I
N
O
Gatilhos
Corpo do gatilho
PL/SQL - 132
Tpicos_Especiais1 - PL-SQL
22
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Gatilhos
Gatilhos
Sintaxe
Exemplo
SQL>
2
3
4
5
6
7
8
9
10
11
D
I
N
O
Tpicos_Especiais1 - PL-SQL
PL/SQL - 135
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 137
Combinando - DML
CREATE OR REPLACE TRIGGER secure_emp
BEFORE DELETE OR INSERT OR UPDATE ON emp
BEGIN
IF (TO_CHAR (sysdate,`DY`) IN (`SAT`,`SUN`))
OR (TO_NUMBER (TO_CHAR(sysdate,`HH24`)) NOT BETWEEN 8 AND 18) THEN
IF DELETING THEN
RAISE_APPLICATION_ERROR (-20502, `Nao e possivel remover funcionario fora do
horario normal de
trabalho);
ELSIF INSERTING THEN
RAISE_APPLICATION_ERROR (-20503, `Nao e possivel inserir funcionario fora do
horario normal de
trabalho);
ELSIF UPDATING (SAL) THEN
RAISE_APPLICATION_ERROR (-20504, `Nao e possivel alterar a coluna salario do
funcionario fora do
horario normal de trabalho);
END IF;
END IF;
END;
D
I
N
O
PL/SQL - 134
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo - Before
Tpicos_Especiais1 - PL-SQL
PL/SQL - 136
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo
CREATE OR REPLACE TRIGGER audit_emp
BEFORE DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE audit_table
SET del = del + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
ELSIF INSERTING THEN
UPDATE audit_table
SET ins = ins + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
ELSIF UPDATING THEN
UPDATE audit_table
SET upd = upd + 1
WHERE user_name = user AND table_name = `EMP`
AND column_name IS NULL;
END IF;
Tpicos_Especiais1 - PL-SQL
PL/SQL - 138
END;
23
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Exemplo 2
Trigger Sal_maior_gerente
create or replace trigger sal_maior_gerente
after update or insert of sal on emp
for each row
declare
v_sal emp.sal%TYPE;
PL/SQL - 139
Tpicos_Especiais1 - PL-SQL
D
I
N
O
begin
SELECT sal INTO v_sal from emp where empno = :new.mgr;
IF (:new.sal > v_sal) THEN
IF UPDATING('SAL') THEN
RAISE_APPLICATION_ERROR (-20701, 'salario Atualizado nao
pode ser maior que o salario do gerente');
ELSIF INSERTING THEN
RAISE_APPLICATION_ERROR (-20702, 'salario Inserido no
pode ser superior ao salrio do gerente');
end if;
end if;
end;
/
D
I
N
O
Auditoria
Criar uma tabela de auditoria:
CREATE TABLE AUDIT_EMP_VALUES (USER_NAME VARCHAR2(10),
TIMESTAMP DATE,
EMPNO
NUMBER(5),
OLD_NAME VARCHAR2(20),
NEW_NAME VARCHAR2(20),
OLD_JOB VARCHAR2(10),
NEW_JOB VARCHAR2(10),
OLD_MGR NUMBER(5),
NEW_MGR NUMBER(5),
OLD_SAL NUMBER(12,2),
NEW_SAL NUMBER(12,2));
Criar a Trigger:
CREATE OR REPLACE TRIGGER audit_emp_values
AFTER DELETE OR INSERT OR UPDATE ON emp
FOR EACH ROW
BEGIN
INSERT INTO audit_emp_values ( user_name, timestamp, empno, old_name, new_name, old_job,
new_job, old_mgr, new_mgr, old_sal, new_sal)
VALUES ( user, sysdate, :old.empno, :old.ename, :new.ename, :old.job, :new.job, :old.mgr, :new.mgr,
:old.sal, :new.sal);
END;
/
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Sintaxe:
ALTER TRIGGER nome_do_trigger
DISABLE/ENABLE
ou
ALTER TABLE nome_da_tabela
DISABLE/ENABLE ALL TRIGGERS
Quando um trigger criado, ele fica disponvel
automaticamente.
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 143
PL/SQL - 142
Tpicos_Especiais1 - PL-SQL
D
I
N
O
TRIGGERS ARMAZENADAS
PL/SQL - 141
Desabilitando Gatilhos
PL/SQL - 140
Tpicos_Especiais1 - PL-SQL
PL/SQL - 144
Tpicos_Especiais1 - PL-SQL
24
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Variveis de Ligao
Exemplo em SQL/Plus
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Exemplo:
erro se pergunta devolver
0 (NO_DATA_FOUND)
ou mais do que 1 linha
(TOO_MANY_ROWS)
clusula INTO crucial
DECLARE
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal:= sal + v_sal_increase
WHERE job = ANALYST;
END;
Dino Spoto
PL/SQL - 149
PL/SQL - 148
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Tpicos_Especiais1 - PL-SQL
BEGIN
INSERT INTO emp(empno, ename, job, deptno)
VALUES empno_sequence.nextval,Harding,Clerk, 10);
END;
PL/SQL - 147
D
I
N
O
DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno
NUMBER NOT NULL :=10;
BEGIN
SELECT SUM(sal) --group function
INTO
v_num_sal
FROM
emp
WHERE dptno=v_deptno;
END;
Registros
PL/SQL - 146
Tpicos_Especiais1 - PL-SQL
SELECT select_list
INTO {variable_name[, variable_name]
| record_name}
FROM table
WHERE condition;
Tpicos_Especiais1 - PL-SQL
D
I
N
O
Registros encaixados
DECLARE
TYPE TimeRec IS RECORD (mins SMALLINT, hrs SMALLINT);
TYPE MeetingRec IS RECORD (
day DATE,
time_of TimeRec, -- nested record
room_no INTEGER(4));
TYPE PartyRec IS RECORD (
day DATE,
time_of TimeRec, -- nested record
place VARCHAR2(25));
seminar MeetingRec;
party PartyRec;
BEGIN ...
party.time_of := seminar.time_of;
END;
PL/SQL - 150
Tpicos_Especiais1 - PL-SQL
25
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
Tabelas
DECLARE
TYPE NumList IS TABLE OF NUMBER;
depts NumList := NumList(10, 20, 30, 40);
BEGIN
depts.DELETE(3); -- apaga terceiro elemento
FORALL i IN depts.FIRST..depts.LAST ligao em massa
DELETE FROM emp WHERE deptno = depts(i); -- causa erro
END;
D
I
N
O
D
I
N
O
no
Open
cria uma
identifica
rea no SQL conjunto
activo
PL/SQL - 153
Fetch
Empty?
Close
D
I
N
O
Dino Spoto
PL/SQL - 152
PL/SQL - 154
liberta conjunto
ativo
PL/SQL - 155
Delete
Cursores - declarao
DECLARE
CURSOR c1 IS SELECT empno, ename, job, sal FROM emp
WHERE sal > 2000;
CURSOR c2 RETURN dept%ROWTYPE IS
SELECT * FROM dept WHERE deptno = 10;
Tpicos_Especiais1 - PL-SQL
Extend
Trim
Tpicos_Especiais1 - PL-SQL
yes
carrega linha
testa fim de
corrente
dados
Prior
Next
Tpicos_Especiais1 - PL-SQL
First
Last
Declare
Exists
Count
Tpicos_Especiais1 - PL-SQL
PL/SQL - Cursores
D
I
N
O
PL/SQL - 151
Tpicos_Especiais1 - PL-SQL
Tabelas
Tpicos_Especiais1 - PL-SQL
26
UNIVEM
D
I
N
O
PL/SQL
D
I
N
O
DECLARE
emp_rec emp%ROWTYPE;
-- ou emp_rec emp_stuff.c1%ROWTYPE
...
BEGIN
...
OPEN emp_stuff.c1;
LOOP
FETCH emp_stuff.c1 INTO emp_rec;
EXIT WHEN emp_suff.c1%NOTFOUND;
...
END LOOP;
CLOSE emp_stuff.c1;
END;
Tpicos_Especiais1 - PL-SQL
D
I
N
O
PL/SQL - 157
D
I
N
O
PL/SQL - 159
DECLARE
bonus REAL;
BEGIN
FOR emp_rec IN (SELECT empno, sal, comm FROM emp) LOOP
bonus := (emp_rec.sal * 0.05) + (emp_rec.comm * 0.25);
INSERT INTO bonuses VALUES (emp_rec.empno, bonus);
END LOOP;
COMMIT;
END;
Cursor de sub-pergunta
D
I
N
O
Tpicos_Especiais1 - PL-SQL
PL/SQL - 158
Tpicos_Especiais1 - PL-SQL
PL/SQL - 160
Tpicos_Especiais1 - PL-SQL
D
I
N
O
FIM
UNIVASF - CECOMP
edmundo.spoto@univasf.edu.br
Tpicos_Especiais1 - PL-SQL
Dino Spoto
PL/SQL - 161
PL/SQL - 162
Tpicos_Especiais1 - PL-SQL
27