Escolar Documentos
Profissional Documentos
Cultura Documentos
Material de Apoio
Oracle
1
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
ÍNDICE
1. Introdução............................................................................................................................... 3
2. Objetivo.................................................................................................................................. 3
3. Tabelas e colunas (Tables and columns)................................................................................ 3
4. Sequences (sequências) .......................................................................................................... 6
5. Tabela DUAL......................................................................................................................... 8
6. Funções e Operadores de linhas simples................................................................................ 8
7. SQL e PL/SQL ..................................................................................................................... 11
8. Estrutura de um Bloco PL/SQL ........................................................................................... 15
9. Views.................................................................................................................................... 17
10. Index (índice) ..................................................................................................................... 18
11. Procedures, Functions e Triggers ....................................................................................... 19
12. Tratamento de Erros (Exceções) ........................................................................................ 29
13. Cursor ................................................................................................................................. 34
2
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
1. Introdução
O Oracle é um sistema gerenciador de banco de dados (SGBD) relacional utilizado
por muitas empresas hoje em dia. Sua aplicação vem aumentando consideravelmente por
oferecer confiabilidade (segurança/suporte) e alto desempenho com grandes volumes de
dados e transações.
2. Objetivo
Esta apostila tem como objetivo oferecer aos alunos informações para a
compreensão de funcionalidades básicas do Oracle.
Exemplos.
3
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
CID_COD NUMBER(3),
CONSTRAINT FK_CLI_CIDADE FOREIGN KEY (CID_COD)
REFERENCES CIDADE(CID_COD));
size = tamanho
Tipo Descrição
CHAR(size) Aceita dados alfanuméricos. Tamanho (size) fixo, podendo ser
utilizado de 1 a 2000 caracteres.
VARCHAR2(size) Aceita dados alfanuméricos. Tamanho variável pelo estipulado em
(size), podendo variar de 1 a 4000 caracteres.
VARCHAR(size) Mesmo que o tipo Varchar2 (não é recomendado). Existe para
manter compatibilidade com versões anteriores.
DATE Valor de data e hora abrangendo 01/01/4712 a.C. até 31/12/4712
d.C.
LONG Similar ao Varchar2, porém o tamanho máximo é de 2 GB. A
documentação da Oracle não recomenda seu uso. Existe para
manter compatibilidade com versões anteriores. Sugere como
alternativa a utilização de CLOB.
NUMBER(I,D) Valor numérico, onde: I = quantidade total de dígitos
(inteiros+decimais) e D = quantidade de dígitos decimais
RAW Usado para dados binários ou dados não interpretados pelo Oracle,
como uma seqüência de caracteres gráficos, arquivos executáveis,
arquivos PDF, etc. Tem tamanho máximo de 2000 bytes
LONG RAW Similar ao Raw, mas com tamanho de até 2 GB
BLOB Binary Large Object – suporta dados binários com tamanho até 4 GB
CLOB Large Object – suporta dados caracteres com tamanho até 4 GB
BFILE Utilizado como apontador para um arquivo binário em um servidor de
arquivos – tamanho até 4 GB
Existem diversos outros tipos aceitos pelo Oracle, mas que não foram abordados
aqui por não fazerem parte do escopo da disciplina.
4
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Podem ser:
NOT NULL impede que um valor nulo seja inserido nesta coluna.
UNIQUE KEY especifica uma coluna ou uma série de colunas que não podem ter
valores repetidos ao longo da tabela.
PRIMARY KEY identificador único de cada linha em uma tabela.
FOREIGN KEY estabelece e reforça uma chave estrangeira entre uma coluna e a
tabela relacionada.
CHECK estabelece uma condição que deve ser verdadeira.
Exemplos
Outros exemplos:
5
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Note que cada coluna tem o seu tamanho e o tipo de dados associado, bem como
algumas colunas possuem as seguintes constraints
PRIMARY KEY
NOT NULL,
DEFAULT 10
CHECK (SALÁRIO < 180)
UNIQUE
A constraint FOREIGN KEY nos obriga a ter uma tabela DEPTO, cuja coluna
DEP_COD tenha o valor que estamos inserindo nesta linha neste momento.
Outros exemplos:
4. Sequences (sequências)
Uma seqüência ou sequence é usada para gerar uma lista de números seqüências
para as colunas numéricas das tabelas de um banco de dados, recomendada
principalmente para chaves primárias. As seqüências simplificam a programação de
aplicações pois geram automaticamente e sem degradação de performance, valores
seqüências para linhas de uma ou mais tabelas, portanto não acessam o disco, não ocorrem
locks implícitos ou explícitos em suas estruturas e, assim a serialização é reduzida, pois dois
ou mais comandos podem utilizá-las ao mesmo tempo.
Os números seqüências gerados pelo Oracle são inteiros de 38 dígitos e são
definidos em um banco de dados. A definição de uma seqüência mostra diversas
informações como o nome da seqüência, se a geração dos números é ascendente ou
descendente, o intervalo entre os números gerados, e outras informações. As definições de
todas as seqüências de um banco são armazenadas em uma tabela do dicionário de dados.
Os números seqüências são usados pelos comandos SQL para gerar um novo
número seqüencial ou usar o número atual. Os números seqüências são gerados
independentemente das tabelas mas podemos usar um gerador de números seqüências
para mais de uma tabela.
6
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Resumindo:
• automaticamente gera números únicos;
• é um objeto compartilhável;
• é tipicamente usada para criar um valor para uma chave primaria;
• substitui código em aplicações
• aumenta a velocidade para acessar valores seqüenciais armazenados na
memória (“cacheados”).
Sintaxe:
7
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Situação 1:
Situação 2:
5. Tabela DUAL
Tabela do usuário SYS com acesso público para ser utilizado em instruções “select”
que necessitam retornar uma única linha, sem necessidade de acesso a atributos de outras
tabelas.
Exemplo:
8
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Funções Gerais
LOWER converte uma string em minúscula
UPPER converte uma string em maiúscula
INITCAP Retorna a string com o primeiro caractere de cada
palavra em maiúsculo e os caracteres restantes
em minúsculo
CONCAT Concatenação de strings - equivalente a ||
SUBSTR(coluna/expressão,m[,n]) retorna caracteres especificados a partir da
posição m até a posição n da coluna/expressão.
LENGTH(coluna/expressão) retorna o número de caracteres (tamanho) da
coluna/expressão
INSTR retorna a posição em que a string2 está contida
(str1,str2,p_ini,ocorrencia,’string’) de string1.
p_ini: posição de string1 a partir da qual será
iniciada a busca – opcional – default 1
ocorrência: indica o número da ocorrência – se
retorna na 1a. ocorrência encontrada, na 2a., e
assim por diante – opcional – default 1.
LPAD(string1,n,string2) Retorna string1 preenchida à esquerda até o
comprimento de n com os caracteres de string2.
RPAD(string1,n,string2) Retorna string1 preenchida à direita até o
comprimento de n com os caracteres de string2.
ROUND(coluna/expressão,n) arredonda a coluna/expressão para n casas
decimais.
TRUNC(coluna/expressão,n) trunca a coluna/expressão em n casas decimais e
se n for omitido, pega somente a parte inteira da
expressão
NVL(coluna/expressão,n) converte um valor nulo na expressão n
Ex: NVL(salário,’não estipulado’)
DECODE(coluna/expressão, decifra a coluna/expressão e compara com
pesquisa1, resultado1[, pesquisa2, pesquisaN, devolvendo como resultado o
resultado2,...,][default]) resultadoN, se nenhum for encontrado segue o
default
MOD(m,n) retorna o resto da divisão
Funções de data e hora
SYSDATE retorna a data e a hora do sistema
data + numero resulta em data + numero dias (data)
date - numero resulta em data - numero (data)
date - date número de dias (inteiro)
date + numero/24 adiciona um número de horas a uma data (data)
MONTHS_BETWEEN(data1,data2) Retorna o número de meses entre data1 e data2
ADD_MONTHS(d,x) Retorna a data d mais x meses
NEXT_DAY(data,dia_semana) A partir da data informada, retorna a data do
próximo dia da semana especificado.
Onde dia_semana;
1–domingo, 2-segunda,.....,6-sábado
LAST_DAY(data) Retorna a data do último dia do mês
ROUND(data,formato) arredonda a data para o formato especificado
(opcional) ou para o menor valor possível.
TRUNC trunca a data, para o formato especificado
9
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Existem vários outros formatos que podem ser verificados nos arquivos de referência
no diretório público.
Algumas situações serão apresentadas para melhor entendimento.
SELECT NOT_NUM,
TO_CHAR(NOT_DATA,'DD/MM/YYYY HH24:MI:SS') AS DATA
FROM NOTA
WHERE NOT_DATA BETWEEN
TO_DATE('01/01/2000 00:00:00','DD/MM/YYYY HH24:MI:SS') AND
TO_DATE('091231235959', 'YYMMDDHH24MISS');
Neste caso note que para exibir o atributo NOT_DATA (definido como “date” na
tabela) foi utilizada a função TO_CHAR para formatar o modo de exibição. Caso não tivesse
sido usada a função, seria exibida a data no formato padrão do “client” do Oracle.
Outro detalhe está presente na cláusula WHERE quando há a comparação do
atributo NOT_DATA. Tem-se que comparar DATE com DATE, por isso transformar a string
entre aspas em DATE com a função TO_DATE.
10
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
7. SQL e PL/SQL
Structured Query Language (Linguagem estruturada de consulta) a SQL permite que
você se comunique com o banco de dados com as seguintes vantagens:
1.Eficiência;
2.Facilidade de aprendizado e uso;
3.Funcionalidade total - permite definir, manipular e recuperar dados em tabelas.
11
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
7.3. Sintaxe
7.3.1. Select
12
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
As funções de grupo buscam resumos de operações, tais como total da folha, saldo,
média, etc...
AVG Média (ignora valores nulos)
COUNT Conta o número de registros que
satisfazem o critério especificado.
MAX pega o maior valor (ignora valores nulos)
MIN pega o menor valor (ignora valores nulos)
STDDEV desvio padrão (ignora valores nulos)
SUM soma os valores (ignora valores nulos)
VARIANCE calcula a variância (ignora valores nulos).
GROUP BY agrupa os valores de uma consulta por
esta condição. Todos os itens da consulta
13
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
7.6. Subqueries
Podemos nos deparar com a seguinte ordem: Mostre todos os salários que sejam
maiores que o do empregado ‘Jose’.
A SQL que recupera os dados do banco de dados tem que passar como condição de
busca o salário do ‘Jose’ para a SQL que recupera os dados dos outros funcionários.
SELECT departamento,nome,salario
FROM empregados
WHERE salario > (SELECT salario
FROM empregados
WHERE nome = ‘Jose’);
14
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Tipos de blocos
END;
IF THEN ELSE
IF condição THEN
sequencia_de_intruções;
ELSIF condição THEN
sequencia_de_intruções;
15
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
ELSE
sequencia_de_intruções;
END IF;
A única observação é que a sintaxe precisa ser exata e não temos ferramentas de
interação para analisar onde está o erro precisamente, ainda mais se o mesmo ocorrer
dentro desta estrutura.
LOOP
PL/SQL nos fornece um número de facilidades para estrutura de loop para repetir
uma seqüência de três maneiras básicas: Loop Básico, Loop FOR e Loop WHILE.
LooP Básico:
DECLARE
VAR_COD EMPREGADO.COD_EMPREGADO%TYPE := 100;
VAR_CONTADOR NUMBER(2) :=1;
BEGIN
LOOP
INSERT INTO ITEM(COD_EMPREGADO,ORDEM)
VALUES(VAR_COD,VAR_CONTADOR);
VAR_CONTADOR := VAR_CONTADOR+1;
EXIT WHEN VAR_CONTADOR > 10;
END LOOP;
END;
Loop FOR:
DECLARE
VAR_COD EMPREGADO.COD_EMPREGADO%TYPE := 100;
VAR_CONTADOR NUMBER(2);
BEGIN
FOR VAR_CONTADOR IN 1..10 LOOP
INSERT INTO ITEM(COD_EMPREGADO,ORDEM)
VALUES(VAR_COD,VAR_CONTADOR);
END LOOP;
END;
Loop WHILE:
DECLARE
VAR_COD EMPREGADO.COD_EMPREGADO%TYPE := 100;
VAR_CONTADOR NUMBER(2) :=1;
BEGIN
WHILE VAR_CONTADOR < 10 LOOP
INSERT INTO ITEM(COD_EMPREGADO,ORDEM)
VALUES(VAR_COD,VAR_CONTADOR);
VAR_CONTADOR := VAR_CONTADOR+1;
END LOOP;
END;
16
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
CASE
Sintaxe 1:
CASE VAR_TESTE
WHEN VALOR1 THEN ...INSTRUÇÕES...;
WHEN VALOR2 THEN ...INSTRUÇÕES...;
ELSE ...INSTRUÇÕES...;
END CASE;
Sintaxe 2:
CASE
WHEN VAR_TESTE_1 = VALOR1 THEN
...INSTRUÇÕES...;
WHEN VAR_TESTE_1 < VALOR2 THEN
...INSTRUÇÕES...;
ELSE
...INSTRUÇÕES...;
END CASE;
SELECT CASE
WHEN CLI_COD='01' THEN
'CODIGO 1'
WHEN CLI_COD = '02' THEN
'CODIGO 2'
ELSE
'OUTRO CODIGO'
END AS LOCAL
FROM CLIENTE;
9. Views
Devemos usar uma view para:
17
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo:
SELECT *
FROM NOTA N
WHERE N.NOT_DATA BETWEEN (SYSDATE-30) AND SYSDATE;
SELECT *
FROM CLIENTE C
WHERE CL.CLI_NOME LIKE ‘MARIA%’;
Cria o índice da tabela nas colunas, sendo que a ordem é a que foi digitada.
18
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Removendo índices:
Características
Utilização
19
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Comandos válidos
Comandos inválidos
20
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Colunas relevantes:
. OWNER (não tem em USER_SOURCE)
. NAME
. TYPE
. LINE
. TEXT
Exemplo:
SELECT TEXT
FROM USER_SOURCE
WHERE NAME = 'NOME_DO_OBJETO';
DESCRIBE NOME_DO_OBJETO;
ou
DESC NOME_DO_OBJETO;
11.4. Dependências
21
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
2. Objetos que outros objetos dependem dele (dependência indireta). Exemplo: uma
procedure utiliza uma view de uma table, assim esta procedure tem dependência
indireta desta table.
11.5. Recompilação
11.6. Procedures
Sintaxe de criação
22
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Opção Descrição
OR REPLACE Depois de criada uma procedure, se esta opção não for especificada
numa nova compilação, dará uma mensagem de erro mostrando que a
esta procedure já existe. O comando REPLACE troca a procedure
especificada e suas instruções internas pela que está sendo
compilada.
SCHEMA Ou usuário dono do objeto procedure, se nada for epecificado será
criado com o usuário corrente como dono.
IN Identifica se o parâmetro é de entrada – é a especificação default se
nada for informado. Os parâmetros IN não podem ser seu conteúdo
alterado dentro da procedure.
OUT Identifica se o parâmetro é de saída. Os parâmetros de saída podem
ser alterados dentro da procedure, não sendo possível receber
passagem de valores externos.
IN OUT Identifica que o parâmetro é de entrada e de saída. Isto significa que
além de uma variável com esta especificação poder receber valores
externos por parâmetro, esta também pode ser modificada dentro da
procedure e ter seu valor recuperado no meio externo
(aplicação/programa).
SHOW ERRORS Exibe os erros da procedure, se houver.
Exemplo 1:
-- executando a procedure
SQL> EXECUTE CALCULA_VALES(387,:V_TOTAL);
23
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
11.7. Functions
Sintaxe de criação:
24
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo 1:
Criar uma function que receba como parâmetro de entrada o número de uma nota
fiscal e retorne o valor total dos produtos desta nota.
RETURN(V_TOTAL);
END;
/
SHOW ERRORS;
11.8. Triggers
Um Database Trigger é um bloco PS/SQL associado a uma tabela específica. Ele é
executado implicitamente quando é disparado um comando que altera o conteúdo de uma
tabela.
Um Trigger é composto por quatro partes:
Cada tabela (table) pode ter um Trigger de cada tipo, totalizando então 12 Triggers
por tabela:
. INSERT – UPDATE - DELETE
. BEFORE – AFTER
. FOR STATMENT – FOR EACH ROW (mais utilizado - recomendado)
25
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Sintaxe:
Opção Descrição
OR REPLACE Depois de criada uma trigger, se esta opção não for especificada
numa nova compilação, dará uma mensagem de erro mostrando
que a esta trigger já existe. O comando REPLACE troca a trigger
especificada e suas instruções internas pela que está sendo
compilada.
SCHEMA Ou usuário dono do objeto trigger, se nada for epecificado será
criado com o usuário corrente como dono.
BEFORE/AFTER Especifica se o trigger vai disparado antes ou depois do evento
INSERT/UPDATE/D Indica em quais eventos o trigger será disparado. No caso de
ELETE update ainda há a opção de especificar qual a coluna que deverá
haver mudança para disparar o trigger.
ON NOME_TABELA Indica sobre qual tabela o trigger estará vinculado
REFERENCING Geralmente é omitido, utilizado para nomear as referências OLD e
NEW disponíveis no trigger
FOR EACH ROW Indica se o trigger será disparado após a alteração de cada linha
da tabela
FOR EACH Indica se o trigger será disparado após o término do comando de
STATEMENT alteração da tabela (pouco utilizado)
WHEN CONDIÇÃO Pode-se nesta opção especificar uma condição para o disparo do
trigger
SHOW ERRORS Exibe os erros da procedure, se houver.
26
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo 1:
Similaridades:
1. Feitos através de comandos SQL e PL/SQL
2. Usam área SQL compartilhadas
3. O SGBD verifica automaticamente as dependências
Diferenças:
1. Um trigger está associado a uma tabela
2. Um trigger é chamado implicitamente, a procedure não
3. COMMIT, ROOLBACK e SAVEPOINT não são permitidos em triggers e em
procedures chamadas por eles.
4. Não há GRANT (privilégio) para executar um trigger
Expressões
Para referenciar os valores novos e velhos das colunas no trigger, usa-se os prefixos
OLD e NEW.
27
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Nota:
Predicados Condicionais
1. IF INSERTING...
2. IF UPDATING...
3. IF DELETING…
11.9. Atenção
Um erro muito comum em stored procedures e triggers é a ocorrência, no bloco
executável, de instruções “select” sem a cláusula “into”. Todo “select” nestes casos tem que
possuir a cláusula “into”, atribuindo os valores das colunas de uma tabela para variáveis; e
este “select...into” pode retornar somente 1 linha. Se retornar 0 linha ou mais de 1 linha,
ocorre um erro.
Exemplo:
28
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
DECLARE Bloco de
A NUMBER:=1; tratamento de
B NUMBER:=0; erros
X NUMBER;
BEGIN
X := A/B;
EXCEPTION
WHEN OTHERS THEN -- qualquer erro
... tratamento/instruções
END;
29
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
RAISE_APPLICATION_ERROR (número_erro,mensagem)
30
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo:
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001,’CODIGO DE FUNCIONARIO NÃO
ENCONTRADO’);
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002,’ALGUM OUTRO ERRO OCORREU...’);
END;
Pode-se construir blocos dentro de outros blocos e assim por diante, para que se
tenha o funcionamento esperado.
31
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo:
BEGIN
BEGIN
EXCEPTION
WHEN . . . THEN
INSERT...;
IF . . . THEN. . . END IF;
WHEN . . . THEN
BEGIN
EXCEPTION
END;
END;
EXCEPTION
END;
12.5 Exception_Init
Existe a possibilidade de associar um erro do Oracle a uma exceção nomeada
(nome), ou seja, podemos associar um código de erro do Oracle a um nome.
Sintaxe:
PRAGMA_EXCEPTION_INIT(nome_do_erro,número_do_erro_oracle)
32
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo:
V_CONT NUMBER;
V_ERRO1 EXCEPTION;
V_ERRO2 EXCEPTION;
-- EXCEPTION_INIT pragma
PRAGMA EXCEPTION_INIT(V_ERRO2,-2292);
-- integrity constraint violated - child record found
BEGIN
BEGIN
P_ERRO := 'N';
P_MSG := 'OK';
IF V_CONT = 0 THEN
RAISE V_ERRO1;
END IF;
COMMIT;
EXCEPTION
WHEN V_ERRO1 THEN
P_ERRO := 'S';
P_MSG := 'CÓDIGO NÃO ENCONTRADO....';
WHEN V_ERRO2 THEN
P_ERRO := 'S';
P_MSG := 'NÃO FOI POSSÍVEL APAGAR. HÁ REGISTRO
RELACIONADOS COM ESTE CODIGO...';
END;
END;
33
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
13. Cursor
DECLARE
CURSOR NOME_DO_CURSOR IS
DECLARAÇÃO_SELECT;
Nota: Não inclua a cláusula “INTO” dentro da declaração do cursor, pois ele
aparece depois dentro da declaração “FETCH”, implicitamente.
Se a declaração “SELECT” utiliza qualquer variável, é correto declará-
la(s) antes da declaração do cursor.
OPEN NOME_DO_CURSOR;
34
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
CLOSE NOME_DO_CURSOR;
Nota: Não tente buscar dados de um cursor uma vez que ele esteja fechado.
Para buscar linha a linha de um cursor, é necessário determinar quando entrar e sair
de um “LOOP” pela inspeção de um atributo do cursor.
Exemplo 1:
DECLARE
CURSOR C_ALUNOS IS
SELECT ALU_COD, DT_TRANCOU
FROM ALUNOS
WHERE DT_TRANCOU < TO_DATE('01/01/2000', 'DD/MM/YYYY');
V_ALU_COD ALUNOS.ALU_COD%TYPE;
V_DT_TRANCOU ALUNOS.DT_TRANCOU%TYPE;
BEGIN
OPEN C_ALUNOS;
LOOP
FETCH C_ALUNOS INTO V_ALU_COD, V_DT_TRANCOU;
CLOSE C_ALUNOS;
COMMIT;
END;
35
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Existe um caminho mais curto para buscar linhas de um cursor utilizando a estrutura “FOR
LOOP”:
Exemplo 2:
DECLARE
V_NUM_PEDIDO PEDIDO_ITEM.NUM_PEDIDO%TYPE;
CURSOR C_ITEM IS
SELECT PROD_COD, SUM(QUANT*VALOR) AS TOTAL
FROM PEDIDO_ITEM
WHERE NUM_PEDIDO = V_NUM_PEDIDO
GROUP BY PROD_COD;
BEGIN
V_NUM_PEDIDO := 10;
FOR VREG IN C_ITEM LOOP -- open, fetch e declaração de VREG
-- implícito
COMMIT;
END;
Exemplo 3:
36
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
BEGIN
FOR VREG IN C_ALUNOS LOOP
IF V_REG.ALU_DESCTO = 0 THEN
SELECT COUNT(*) INTO V_CONT
FROM FUNCIONARIOS
WHERE FUN_CPF = V_REG.ALU_CPF;
IF V_CONT <> 0 THEN
UPDATE ALUNOS
SET ALU_DESCTO = 50
WHERE CURRENT OF C_ALUNOS;
END IF;
END IF;
END LOOP;
COMMIT;
END;
Nota: é importante destacar que a cláusula “FOR UPDATE” faz com que os registros
(linhas) da tabela que o cursor envolve sejam “locados/bloqueados” quando o cursor é
aberto; e permanecem assim até que o mesmo seja fechado e após um “commit” ou
“rollback” se foram feitas modificações nestas linhas da tabela.
Exemplo 4:
No SQL/PLUS:
DECLARE
CURSOR C_CLIENTE IS
SELECT C.CLI_NOME, D.CID_NOME
FROM CLIENTE C, CIDADE D
WHERE C.CID_COD = D.CID_COD;
VNOME CLIENTE.CLI_NOME%TYPE;
VCIDADE CIDADE.CID_NOME%TYPE;
BEGIN
OPEN C_CLIENTE;
LOOP
FETCH C_CLIENTE INTO VNOME, VCIDADE;
EXIT WHEN C_CLIENTE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(VNOME||' - '||VCIDADE);
END LOOP;
CLOSE C_CLIENTE;
END;
37
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
END LOOP;
COMMIT;
END;
38
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo 1:
IS
V_CID_COD CIDADE.CID_COD%TYPE;
BEGIN
P_ERRO := 'N';
P_MSG := 'OK';
UPDATE CIDADE
SET CID_NOME = P_CID_NOME,
CID_UF = P_CID_UF
WHERE CID_COD = P_CID_COD;
END;
39
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo 2:
BEGIN
SELECT CID_NOME, CID_UF INTO P_CID_NOME, P_CID_UF
FROM CIDADE
WHERE CID_COD = P_CID_COD;
END;
Onde:
nome_do_tipo é o nome do novo tipo de referência
tipo_de_retorno é um tipo de registro que indica os tipos da lista “select” que
por fim retornarão pela variável de cursor.
40
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
DECLARE
-- utilizando %rowtype
TYPE TP_CIDADE IS REF CURSOR
RETURN CIDADE%ROWTYPE;
V_VAR1 TP_REGISTRO;
V_MEU_CURSOR TP_MEU_REFCURSOR;
Para utilizarmos o Ref Cursor para declarar uma variável a ser utilizada como
parâmetro de saída em uma procedure ou function, a principal funcionalidade no escopo em
questão, tem-se que criar uma package criando e definindo um nome para um tipo “ref
cursor”:
41
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Exemplo 3:
Passo 1 – É necessária a criação do tipo “ref cursor”. Como trata-se de um cursor variável
que pode representar diferentes estruturas e resultados de instruções “select”, basta criar
um único tipo para ser utilizado em todo o banco de dados. Não há a necessidade de criar
um tipo para cada variável ou parâmetro de stored procedure que tiver que ser declarada.
Passo 2 – Cria-se uma procedure ou function que tenha como parâmetro de saída uma
variável do tipo ref cursor definido na package:
42
Universidade do Oeste Paulista
Faculdade de Informática de Presidente Prudente
Referências Bibliográficas
URMAN, Scott; tradução: Edson Furmankiewicz. Oracle 9i Programação PL/Sql. Rio
de Janeiro: Elsevier, 2002.
43