Documente Academic
Documente Profesional
Documente Cultură
Estados
Banco Dados Atuais
Operacional
descartado
2.1. CONCEITOS
1
INMON, Bill. et al. Building the Data Warehouse (John Wiley & Sons Inc., 1996).
Prof. Dr. Alex Sandro Romeo de Souza Poletto – Email:apoletto@femanet.com.br
5
Segundo Kroenke (1998, p. 280)
Data Warehouse é um depósito de dados corporativo que se
destina a facilitar a tomada de decisões na empresa. Um
Data Warehousing não inclui apenas dados, mas também
ferramentas, procedimentos, treinamentos, pessoal e outros
recursos que facilitam o acesso aos dados e os tornam mais
adequados aos responsáveis por tomada de decisões.
2.1.1 PROPRIEDADES
Desta forma, pode-se dizer que o início do fio condutor do serviço de data
warehouse é o delineamento sobre o assunto que se quer controlar,
portanto, sem ter o assunto definido não faz sentido se pensar em um
ambiente de Data Warehouse.
Vendas Vendas
Varejo Atacado
Área de
Assunto
(VENDAS)
2.1.2.2. INTEGRADO
O fato de um Data Warehouse ser “não volátil” significa que os dados uma
vez carregados nunca mais são alterados pelos usuários, apenas consultados,
a não ser em novas cargas de dados (GONÇALVES (2003, p.14)).
alteração carga
O exemplo a seguir esboça bem como esta propriedade funciona. Pegue uma
fotografia sua, quando recém nascido, depois, pegue outra quando você
tinha cinco anos, e compare. Com certeza, muitas modificações ocorreram,
mas as fotos retratam exatamente a sua situação naquele exato momento
no tempo, e isso acontece da mesma forma com o ambiente de Data
Warehouse. Isto nos possibilita poder traçar uma análise histórica e
comparativa entre os fatos (OLIVEIRA, 2002, p.5).
Estados
Passados e
Banco Dados
Atuais
Temporais
Analisando as citações dos dois autores, nota-se que os dois destacam que
os bancos de dados temporais devem armazenar todos os estados passados
e presente de um dado, ou seja, toda e qualquer mudança ocorrida no Banco
de Dados Operacional deve ser enviada para o Banco de Dados Temporal.
Essa preocupação, de gerar dados temporais, foi um dos motivos que levou a
propor este trabalho, já que a informação é um dos ativos mais valiosos de
uma organização, e não se pode simplesmente descartar os estados
passados de um dado que futuramente poderão ser utilizados para uma
tomada de decisão e/ou uma simples auditoria.
2.1.3. GRANULARIDADE
• por data: pode-se usar a data da venda dos produtos para dividir a
tabela de vendas em vendas por período de data, como também utilizar o
ano da data para dividir as declarações de imposto de renda por ano base,
etc.;
• por área geográfica: pode-se utilizar a unidade federal (UF) para dividir
as vendas de uma empresa nacional em vendas por estado, com também
utilizar o nome da cidade para dividir os movimentos dos clientes de uma
grande agência bancária ou até mesmo separar as vendas de uma empresa
multinacional pela sigla do país, etc.;
• por unidade organizacional: separar os dados de uma empresa por
organizações, pelo número de filiais, etc.;
• ou até mesmo combinando vários desses critérios ou por qualquer outra
informação relevante ao negócio da empresa.
3.1. CONCEITOS
TABELA FATO
Chave Dimensão 1
Chave Dimensão 2
Chave Dimensão 3
Chave Dimensão x
Fato 1
Fato 2
......
Fato n
DIMENSÃO 1 DIMENSÃO 2
ID_DIMENSÃO_1 ID_DIMENSÃO _2
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. FATO .
ATRIBUTO_N ATRIBUTO_N
ID_DIMENSÃO_1
ID_DIMENSÃO_2
ID_DIMENSÃO_3
ID_DIMENSÃO_N
ATRIBUTO_1
ATRIBUTO_2
.
.
DIMENSÃO 3 ATRIBUTO_N DIMENSÃO N
ID_DIMENSÃO_3 ID_DIMENSÃO_N
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
ATRIBUTO_N ATRIBUTO_N
DIMENSÃO_1 DIMENSÃO_2
ID_DIMENSÃO_1 ID_DIMENSÃO _2
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
FATO
ATRIBUTO_N ATRIBUTO_N
ID_DIMENSÃO_1
ID_DIMENSÃO_2
ID_DIMENSÃO_3
ID_DIMENSÃO_N
ATRIBUTO_1
ATRIBUTO_2
.
.
DIMENSÃO_3 ATRIBUTO_N DIMENSÃO_N
ID_DIMENSÃO_3 ID_DIMENSÃO_N
ATRIBUTO_1 ATRIBUTO_1
ATRIBUTO_2 ATRIBUTO_2
. .
. .
ATRIBUTO_N ATRIBUTO_N
DIMENSÃO_31
ID_DIMENSÃO_31
ATRIBUTO_1
ATRIBUTO_2
.
.
ATRIBUTO_N
Características BD operacionais DW
Objetivo Operações Diárias Análise do Negócio
Decisões Cotidianas Decisões Estratégicas
de Longo Prazo
Nº Usuários 10X X
Tipo Usuários Operadores Gerência
Interação Usuário Somente pré-definida Pré-definida e adhoc
Volume MB - GB GB - TB
Granularidade Dados detalhados Dados detalhados e
resumidos
Alteração Dados mudam Dados mudam
constantemente raramente
Dados Atuais/Operacionais Históricos
Justificativa
Este passo toma por base o fato de que é essencial que sejam selecionados
todos os conjuntos de entidades e atributos que realmente participarão do
processo de geração de dados históricos.
Não devem ser descartados os conjuntos de entidades que podem ter seus
valores alterados ao longo do tempo, já que são, normalmente, vitais ao
processo de análise. Também não devem ser totalmente descartados os
conjuntos de entidades que conterão os valores descritivos, já que os
mesmos podem também ser úteis na geração do Banco de Dados Histórico.
Este passo visa a evitar a seleção de atributos que não sejam essenciais
Exemplo
Seja o trecho de modelo de dados da Figura 13.
Justificativa
A relevância deste passo assenta-se no fato de que é necessário definir as
entidades para o armazenamento dos dados históricos. Sua função é
oferecer um meio para a representação dos vários valores que uma entidade
ou atributo pode assumir ao longo do tempo, já que nos Bancos de Dados
Operacionais as representações baseiam-se em valores atuais do negócio.
Exemplo
Seja o trecho de modelo de dados operacional da Figura 15.
Por outro lado, em se tratando de dados históricos, essa estrutura não seria
suficiente, visto que ela não suportaria mais que um cargo por funcionário, e
muito menos o tempo em que o funcionário possuiu um respectivo cargo.
A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_CARGO.
Justificativa
É primordial, em alguns casos, a inclusão de atributos que controlarão os
períodos nos quais os valores contidos nos conjuntos de entidades
permanecerão válidos. Ou seja, em um período, determinado valor foi
considerado válido. Para que isso seja possível, é necessária a inclusão de
novos atributos de tempo para o controle dos períodos.
Exemplo
Seja o trecho de modelo de dados da Figura 17.
A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_CARGO.
Justificativa
Em alguns casos, pode ser necessário realizar consultas muito complexas
que impliquem acessar um grande volume de tuplas, juntamente com
inúmeros cálculos. Isso poderá atrasar a obtenção das informações. Por
isso, é necessário a adição de atributos derivados, já que tal procedimento
pode eliminar a necessidade da realização de cálculos durante o processo de
recuperação de valores.
Exemplo
A Figura 18 ilustra a adição de um atributo derivado (elipse com fundo
preenchido por cor cinza) em um conjunto de entidades HIST_VENDA,
HORA
PREÇO
DATA PREÇO_ÉPOCA
ID_PROD DESCRIÇÃO
NUMERO QTDE
HORA PREÇO_ÉPOCA
DATA QTDE
NUMERO TOTAL
HIST_VENDA
A tabela que seria criada no Banco de Dados Histórico seria apenas aquela
referente à entidade HIST_VENDA.
Exemplo
A Figura 19 lustra parte de um modelo de dados operacional.
Assim, a tabela que seria criada no Banco de Dados Histórico seria apenas
aquela referente à entidade HIST_VENDA.
Código Código
Descrição Nome
Salário
VERBA RECEBE
possui CATEGORIA
Código Mês_Ano
Descrição ID
Quantidade
Categoria Descrição
Valor
Referência Categoria_atual
EMPREGADO
.....
ID
LOCALIDADE reside Nome EXERCE COORDENADORIA
Dt_nasc
ID Sexo
Descrição Endereço Código
Estado Dt_admis Descrição
.....
DISCIPLINA NOTA_FALTA SITUACAO_MATRICULA
RA
Código Código
Turma
Descrição Descrição
Ano
Nota1 possui
Nota2
Média
reside
Faltas1. . .Faltas12
.....
Matricula Código
ACADEMICO_SITUACAO
Nome Coordenadoria
Código possui Série Descrição
Descrição Turma .....
.....
REQUISITOS
RESULTADO
4. LINGUAGEM PL/SQL
4.1. INTRODUÇÃO
4.2.1. INTEGRAÇÃO
SQL
SQL
OUTROS
APLICAÇÃO
DBMS
SQL
SQL
IF ... THEN
SQL ORACLE
APLICAÇÃO ELSE
SQL
END IF;
SQL
4.2.3. CARACTERÍSTICAS
OPERAÇÕES PERMITIDAS
Ilustrando:
DECLARE – opcional
Declarações – variáveis, cursores, constantes, estruturas, tabelas, exceções definidas
pelo usuário
BEGIN - obrigatório
Estruturas executáveis (comandos)
Instruções SQL (manipular dados do banco de dados)
Instruções PL/SQL (manipular dados no bloco)
EXCEPTION - opcional
Tratamento de exceções (pode conter outros blocos)
Ações a serem desempenhadas qdo ocorrem erros ou condições anormais
END; - obrigatório
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION - opcional
WHEN exception_name THEN
........
END;
• Use uma barra (/) para executar o bloco anônimo PL/SQL no buffer de
SQL*Plus. Quando o bloco for executado corretamente, sem erros que não
possam ser tratados, a saída de mensagem deverá ser a seguinte:
Exemplo de instruções:
Declare
v_nascimento DATE;
v_codigo NUMBER(5) NOT NULL := 10;
v_cidade VARCHAR2(35) := ‘Assis’;
v_numero CONSTANT NUMBER := 1234;
Identificador := expr;
• expr : é uma expressão PL/SQL que pode ser uma literal, uma
outra variável ou uma expressão que envolve operadores e funções.
Exemplo de instruções:
v_nascimento := ’30-AGO-01’
Exemplo de instruções:
v_descricao VARCHAR2(30);
v_contador BINARY_INTEGER := 0;
v_soma NUMBER(10,2) := 0;
v_reserva DATE := SYSDATE + 7;
c_taxa CONSTANT NUMBER(5,2) := 15.30;
v_filhos BOOLEAN NOT NULL := TRUE;
v_preco1 NUMBER(10,2) := 1500
v_preco2 NUMBER(10,2) := 2500
v_aumento BOOLEAN := (v_preco1 < v_preco2);
Utilizado para declarar uma variável de acordo com uma definição de coluna
de banco de dados ou de acordo com outra variável anteriormente
declarada.
Exemplo de instruções:
…..
v_descricao depto.descricao%TYPE
v_salario v_soma%TYPE := 0;
…..
4.4.10. DBMS_OUTPUT.PUT_LINE
Exemplo de instruções:
SET SERVEROUTPUT ON
ACCEPT v_anual PROMPT ‘Entre com o salário anual.:’
DECLARE
v_salario NUMBER(10,2) := &v_anual;
BEGIN
v_salario := v_salario/12;
DBMS_OUTPUT.PUT_LINE (‘O salário mensal é ‘ | | TO_CHAR(v_salario));
END;
DELIMITADORES
IDENTIFICADORES
LITERAIS
• Crie prefixos de dois hífens (--) para comentários de uma única linha;
• Coloque os comentários de várias linhas entre os símbolos /* e */.
…..
v_salario NUMBER(10,2);
BEGIN
/* computer o salário annual baseado nos salários mensais
para usá-lo em cálculos */
v_salário := &v_anual * 12;
END; -- Final do bloco
Exemplo de instruções:
• CH(10) = ENTER
Exemplo de instruções:
v_nome := LOWER(v_nome);
Exemplo de instruções:
v_data := TO_DATE (‘September 20, 2001’, ‘Month DD, YYYY’);
Operador Operação
**, NOT Exponenciação, negação, lógica
+, - Identidade, negação
*, / Multiplicação, divisão
+, -, || Adição, subtração, concatenação
=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN Comparação
AND Conjunção
OR Disjunção
Exemplo de instruções:
DECLARE
v_codigo NUMBER(2);
v_descricao VARCHAR2(15);
BEGIN
SELECT codigo, descricao
INTO v_codigo, v_descricao
FROM depto
WHERE codigo=1;
END;
*/ devem retornar apenas um valor, caso contrário ocorrerá erros */
DECLARE
v_codigo depto.codigo%TYPE;
v_descricao depto.descricao%TYPE;
BEGIN
SELECT codigo, descricao
INTO v_codigo, v_descricao
FROM depto
WHERE codigo=2;
END;
DECLARE
v_soma_salario professor.salario%TYPE;
v_codigo NUMBER NOT NULL := 2;
BEGIN
SELECT SUM (salario)
INTO v_soma_salario
FROM professor
WHERE codigo=v_codigo;
END;
*/ devem retornar apenas um valor, caso contrário ocorrerá erros */
Exemplo de instruções:
BEGIN
INSERT INTO professor(codigo, nome, salario, nascimento)
VALUES (codigo_sequence.NEXTVAL, ‘Douglas’, 1450, ’10-DEC-00’);
END;
Exemplo de instruções:
DECLARE
v_aumento professor.salario%TYPE := 245;
BEGIN
UPDATE professor
SET salario = salario + v_aumento
WHERE codigo=10;
END;
Exemplo de instruções:
DECLARE
v_codigo professor.codigo%TYPE := 9;
BEGIN
DELETE FROM professor
WHERE codigo=v_codigo;
END;
Exemplo de instruções:
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
v_codigo NUMBER := 4;
BEGIN
DELETE FROM professor
WHERE codigo=v_codigo;
: rows_deleted := (SQL%ROWCOUNT | | ‘ rows deleted.’);
END;
/
PRINT rows_deleted
Você pode alterar o fluxo lógico de instruções dentro do bloco PL/SQL com
diversas estruturas para controle. Esta lição aborda os dois tipos de
estruturas para controle do PL/SQL: construções condicionais com a
instrução IF e estruturas para controle LOOP.
INSTRUÇÕES IF
IF condição THEN
instruções
[ELSIF condição THEN
instruções;]
[ELSE
Instruções;]
END IF
INSTRUÇÃO IF-THEN-END IF
Exemplo de instruções:
.....
IF nome = ‘Alex’ THEN
v_novo_salario := salario * 1.20;
END IF;
......
INSTRUÇÃO IF-THEN-ELSE-END IF
Exemplo de instruções:
.....
IF media >= 7 THEN
v_mensagem := ‘Aprovado’;
ELSE
v_mensagem := ‘Reprovado’;
END IF;
.....
INSTRUÇÃO IF-THEN-ELSIF-THEN-END IF
Exemplo de instruções:
.....
IF salario < 500.00 THEN
v_novo_salario := salario * 1.25;
ELSIF salario < 1000.00 THEN
v_novo_salario := salario + (salario*15/100);
ELSE
v_novo_salario := salario * 1.10;
END IF;
.....
LOOP BÁSICO
LOOP
Instrução1;
.....
EXIT [WHEN condição];
Instruções;]
END LOOP;
Exemplo de instruções:
DECLARE
v_codigo produto.codigo%TYPE := 21;
v_contador NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO produto (codigo,numero)
VALUES(v_codigo, v_contador);
v_contador := v_contador + 1;
EXIT WHEN v_contador > 10;
END LOOP;
END;
FOR LOOP
Exemplo de instruções
DECLARE
v_codigo pedido.codigo%TYPE := 10;
BEGIN
FOR i IN 1..5 LOOP
INSERT INTO pedido (pedido, produto)
VALUES (v_codigo, i);
END LOOP;
END;
WHILE LOOP
Exemplo de instruções:
ACCEPT v_pedido PROMPT ‘Incluir o número do pedido:’
ACCEPT v_produto PROMPT ‘Incluir o número de produtos no pedido:’
DECLARE
v_contador NUMBER(2) := 1;
BEGIN
WHILE v_contador <= &v_produto LOOP
INSERT INTO pedido (pedido, produto)
VALUES (&v_pedido, v_contador);
v_contador := v_contador + 1;
END LOOP;
COMMIT;
END;
São usados para consultas que retornam mais de uma linha. Os cursores
explícitos são declarados e nomeados pelo programador e manipulados por
meio de instruções específicas nas ações executáveis do bloco.
• Pode processar além da primeira linha retornada pela consulta, linha por
linha;
• Controla que linha está sendo processada no momento;
• Permite que o programador controle as linhas manualmente no bloco
PL/SQL.
DECLARANDO O CURSOR
CURSOR cursor_name IS
select_statement;
Exemplos de instruções:
DECLARE
v_matricula professor.matricula%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT matricula, nome
FROM professor
CURSOR depto_cursor IS
SELECT * FROM depto
WHERE codigo=10;
BEGIN
.....
ABRIR O CURSOR
OPEN cursor_name;
Exemplos de instruções:
.....
OPEN defined_cursor;
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
.....
-- Processo dos dados
.....
END;
DECLARE
v_codigo professor.codigo%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT codigo, nome
FROM professor
BEGIN
OPEN professor_cursor;
FOR i IN 1..5 LOOP
FETCH professor_cursor INTO v_codigo, v_nome;
.....
END LOOP;
CLOSE professor_cursor;
END;
FECHAR O CURSOR
CLOSE cursor_name;
%ISOPEN
%NOTFOUND
DECLARE
v_codigo professor.codigo%TYPE;
v_nome professor.nome%TYPE;
CURSOR professor_cursor IS
SELECT codigo, nome
FROM professor
BEGIN
OPEN professor_cursor;
LOOP
FETCH professor_cursor INTO v_codigo, v_nome;
EXIT WHEN professor_cursor%ROWCOUNT > 5
OR professor_cursor%NOTFOUND;
.....
END LOOP;
CLOSE professor_cursor;
END;
TIPOS DE EXCEÇÃO
EXCEÇÕES PREDEFINIDAS
BEGIN
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
WHEN TOO_MANY_ROWS THEN
statement1;
WHEN DUP_VAL_ON_INDEX THEN
statement1;
statement2;
statement3;
END;
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR(255);
BEGIN
....
EXCEPTION
....
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
v_error_message := SQLERRM;
INSERT INTO errors VALUES(v_error_code, v_error_message);
END;
MOVIMENTO RELACIONAL
TABREG
TABFUN
MATRICULA
MATRICULA
TABCAR CARGO
NOME
CODIGO DATA
SALARIO
DESCRICAO SALARIO
ADMISSAO
CARGO
TABDEP
MATRICULA
SEQUENCIA
NOME
NASCIMENTO
Tabela de Cargos
CREATE TABLE tabcar
(codigo NUMBER(2),
descricao VARCHAR2(35) NOT NULL,
CONSTRAINT tabcar_codigo_pk PRIMARY KEY (codigo));
Tabela de Funcionários
CREATE TABLE tabfun
(matricula NUMBER(5),
nome VARCHAR2(35) NOT NULL,
salario NUMBER(9,2) CHECK (salario > 0),
admissao DATE NOT NULL,
cargo NUMBER(2),
CONSTRAINT tabfun_matricula_pk PRIMARY KEY (matricula),
CONSTRAINT tabfun_cargo_fk FOREIGN KEY (cargo)
REFERENCES tabcar(codigo));
Tabela de Dependentes
CREATE TABLE tabdep
(matricula NUMBER(5),
sequencia NUMBER(2),
nome VARCHAR2(35) NOT NULL,
nascimento DATE NOT NULL,
CONSTRAINT tabdep_matricula_pk PRIMARY KEY (matricula,sequencia),
CONSTRAINT tabdep_matricula_fk FOREIGN KEY (matricula)
REFERENCES tabfun(matricula));
Tabela de Registros
CREATE TABLE tabreg
(matricula NUMBER(5),
cargo NUMBER(2),
data DATE,
salario NUMBER(9,2),
CONSTRAINT tabreg_pk PRIMARY KEY (matricula, cargo, data));
4.11.2.1. OBJETIVOS
Procedimento
parâmetro IN
Ambiente de parâmetro OUT
Chamada parâmetro IN OUT
(DECLARE)
BEGIN
EXCEPTION
END;
BEGIN
novos_funcionarios (21,’Dida’,85000,’01/01/2002’,2);
END;
/
Caso você queira usar uma codificação automática para a matricula (auto-
numeração), crie uma seqüência e troque a variável v_matricula por essa
seqüência.
.......
VALUES (num_fun.NEXTVAL, v_nome, v_salario, v_admissão, v_cargo);
......
SET SERVEROUTPUT ON
4.11.2.7. SUMÁRIO
EXERCÍCIOS:
1) Faça um procedimento para excluir funcionários.
2) Faça um procedimento para inserir dependentes.
4.11.3.1. OBJETIVOS
Procedimento
parâmetro IN
Ambiente de
Chamada parâmetro OUT
parâmetro IN OUT
(DECLARE)
BEGIN
EXCEPTION
END;
Executando a função
EXECUTE :g_salario := consulta_salario (11); ou
ACCEPT num_matricula PROMPT ‘Digite o número da matricula:’
EXECUTE :g_salario := consulta_salario (&num_matricula);
Consultando o valor
PRINT g_salario
SET SERVEROUTPUT ON
DECLARE
v_salario tabfun.salario%TYPE;
BEGIN
v_salario := consulta_salario (12);
DBMS_OUTPUT.PUT_LINE (v_salario);
END;
/
DECLARE
v_quant NUMBER(5);
BEGIN
v_quant := mudanca_salario (12);
DBMS_OUTPUT.PUT_LINE (v_quant);
END;
/
Sintaxe:
Exemplo1:
4.11.3.9. OBSERVAÇÕES
• Uma função definida pelo usuário obtém apenas parâmetros IN, e não
OUT ou IN OUT;
• Os tipos de dados devem ser tipos de dados SQL válidos, CHAR, DATE
ou NUMBER;
4.11.3.10. SUMÁRIO
EXERCÍCIOS:
1) Faça uma função para consultar o nome do cargo.
2) Faça uma função para consultar os dependentes por funcionário.
Procedimentos Funções
Executar como uma instrução PL/SQL Chamar como parte de uma expressão
Tipo de dados sem RETURN Deve conter um tipo de dados RETURN
Pode retornar nenhum, um ou muitos valores Deve retornar um valor único
• Desempenho melhorado;
o Reduzir o número de chamadas ao banco de dados e diminuir o
tráfico na rede;
o Compartilhar execuções SQL por vários usuários.
• Manutenção melhorada;
o Modificar rotinas on-line sem interferir com outros usuários;
o Modificar uma rotina que afetará várias aplicações.
• Segurança de dados e Integridade melhorada.
o Controle sobre acessos indiretos aos objetos de banco de
dados executados por funcionários sem privilégios;
o Assegurar que ações relacionadas sejam executadas
conjuntamente.
DESC user_objects
DESC user_source
DESC user_errors
4.11.5.1. OBJETIVOS
• INSERT
• UPDATE
• DELETE
Os gatilhos são divididos em dois tipos, no qual defini quantas vezes o corpo
do gatilho deverá ser executado quando ocorre um evento de acionamento.
Testando o gatilho:
UPDATE tabfun
SET salario = salario*1.10
WHERE matricula = 10;
Testando o gatilho:
UPDATE tabfun
SET salario = salario * 1.30
WHERE matricula = 10;
Testando o gatilho:
Testando o gatilho:
Desabilitar um gatilho
ALTER TRIGGER nome_trigger DISABLE
Carregar um gatilho
START caminho nome_gatilho.SQL
Compilar um gatilho
Sintaxe:
Exemplo1:
DROP TRIGGER salario_fixo;
EXERCÍCIOS:
1) Faça um gatilho que não permita inserir um funcionário com data de
admissão maior que a data do servidor (SYSDATE).
2) Faça um gatilho que não permita alterar ou incluir um funcionário com
salário igual a zero.
4.11.6.1. OBJETIVOS
PROCEDURE update_tabfun_salario (
n_matricula IN tabfun.matricula%TYPE,
n_fator IN NUMBER
) AS
v_tabfun_count INTEGER;
BEGIN
--- conta o número de produtos com o valor de n_matricula fornecido
--- será 1 se o funcionário existir
SELECT COUNT(*)
INTO v_tabfun_count
FROM tabfun
WHERE matricula = n_matricula;
SELECT tabfun_pacote.get_tabfun_ref_cursor
FROM dual;
OBJECT_NAME PROCEDURE_NAME
------------------------------ ------------------------------
TABFUN_PACOTE GET_TABFUN_REF_CURSOR
TABFUN_PACOTE UPDATE_TABFUN_SALARIO
5. LINGUAGEM XML
5.1. INTRODUÇÃO
5.2. XML
Neste capítulo, serão apresentados os conceitos sobre XML, bem como sua
origem e estrutura.
A XML foi desenvolvida em 1996 pela W3C (World Wide Web Consortium),
com base na SGML (Standard Generalized Markup Language – Linguagem de
<carta>
<cabeçalho>
<remetente>Maria</remetente>
<destinatário>João</destinatário>
</cabeçalho>
<parágrafo>Olá</parágrafo>
<parágrafo>Tchau</parágrafo>
</carta>
O fato das tags poderem ser repetidas em um documento XML pode tornar
defeituosa a representação desses dados, porém, quando se trata da troca
desses dados entre aplicações, essas tags tornam o documento fácil de ser
entendido, já que a mensagem se torna auto-documentável.
5.2.3.1. DTD
A DTD é uma linguagem que define as regras de como deve ser a estrutura
de um documento XML. É por meio de uma DTD que é realizada uma análise
do documento XML dizendo se o mesmo está estruturado corretamente ou
não. O uso da DTD é opcional.
<!DOCTYPE CORRESPONDENCIA [
<!ELEMENT carta (cabeçalho | parágrafo) >
<!ELEMENT cabeçalho (remetente | destinatário) >
<!ELEMENT parágrafo (#PCDATA) >
]>
A XSD (XML Schema Definition) tem o mesmo papel que a DTD que é a de
especificar os tipos de elementos em um documento XML e ordená-los,
porém, a XSD possui algumas vantagens sobre a DTD como: a XSD pode
especificar um elemento como sendo do tipo integer, string, boolean, date,
decimal; permite que o usuário crie seus tipos definidos; permite o uso de
chave estrangeira e recursos de exclusividade; utiliza de recursos de
herança; permite utilizar valores mínimos e máximos para restringir os tipos
de elementos.
<xs:schema xmlns=”http://www.w3.org/2001/XMLSchema>
<xs: element name = “carta”/>
<xs: complexType>
<xs: sequence>
<xs: element name=”cabecalho” >
<xs: element name=”remetente” type=”xs:string”/>
<xs: element name=”destinatario” type=”xs:string”/>
</xs: element>
<xs: element name=”paragrafo” type=”xs:string”/>
</xs: sequence>
</xs: complexType>
</xs:schema>
5.2.4. X PATH
5.2.5. XQUERY
XQuery é uma linguagem padrão de consulta para tipos de dados XML. Essa
linguagem é formada por uma seqüência de comandos, são eles: for, let,
where, order by e return. Comandos esses mais conhecidos como a
expressão FLWOR. Esses comandos foram baseados nos comandos da SQL,
porém são diferentes.
for $x in /banco-2/conta
let $numconta: = $x/numero_conta
where $x/ saldo > 400
return <numero_conta> { $numconta} </numero_conta>
5.2.6. XSLT
5.2.7. XMLELEMENT( )
select xmlelement("nome",nome)
as xml_customer
from professor;
XML_CUSTOMER
<nome>ALEX</nome>
<nome>ALMIR</nome>
<nome>BEGOSSO</nome>
<nome>GUTO</nome>
<nome>TALO</nome>
<nome>DOMINGOS</nome>
<nome>OSMAR</nome>
<nome>URSO</nome>
<nome>FABIO</nome>
<nome>DOUGLAS</nome>
5.2.8. XMLATTRIBUTES( )
select xmlelement("professor",
xmlattributes(codigo as "cod", nome as "name",
to_char (nascimento, 'mm/dd/yyyy')as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,2);
Resultado:
XML_CUSTOMERS
<professor cod="1" name="ALEX" nasc="11/17/1971"></professor>
<professor cod="2" name="ALMIR" nasc="05/01/1971"></professor>
5.2.9. XMLFOREST( )
select xmlelement("professor",
xmlforest(codigo as "cod", cargo as "carg",
to_char (nascimento, 'mm/dd/yyyy') as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,3);
Resultado da consulta:
XML_CUSTOMERS
<professor><cod>1</cod><carg>1</carg><nasc>11/17/1971</nasc></professor>
<professor><cod>3</cod><carg>3</carg><nasc>06/09/1971</nasc></professor>
5.2.10. XMLAGG( )
select xmlelement("professor",
xmlagg(xmlelement("professor", nome)
order by cargo asc
)
)
as xml_customers
from professor
where codigo in (1,2);
Resultado do select:
XML_CUSTOMERS
<professor><professor>ALEX</professor><professor>ALMIR</professor></professo
r>
5.2.11. XMLCOLATTVAL( )
select xmlelement("professor",
xmlcolattval(codigo as "cod",nome as "nome",nascimento as "nasc"
)
)
as xml_customers
from professor
where codigo in (1,2);
Resultado:
XML_CUSTOMERS
<professor>
<column name = "cod">1</column>
<column name = "nome">ALEX</column>
<column name = "nasc">1971-11-17</column>
</professor>
<professor>
<column name = "cod">2</column>
<column name = "nome">ALMIR</column>
<column name = "nasc">1971-05-01</column>
</professor>
5.2.12. XMLCONCAT( )
Resultado:
XML_CUSTOMERS
<nome>ALEX</nome><nasc>1971-11-17</nasc><cargo>1</cargo>
<nome>ALMIR</nome><nasc>1971-05-01</nasc><cargo>2</cargo>
5.2.13. XMLPARSE( )
select xmlparse(
content
'<professor><codigo>1</codigo><nome>Alex</nome></professor>'
wellformed
)
as xml_customers
from dual;
Resultado:
XML_CUSTOMERS
<professor><codigo>1</codigo><nome>Alex</nome></professor>
5.2.14. XMLPI( )
Resultado:
XML_ORDER_STATUS_PI
<?order_status placed,pending,shipped?>
5.2.15. XMLCOMMENT( )
Resultado:
XML_COMMENT
<!--Exemplo de comentario XML-->
5.2.16. XMLSEQUENCE( )
Resultado:
ORDER_VALUES
<b>placed</b>
<b>pending</b>
5.2.17. XMLSERIALIZE( )
select xmlserialize(
content
xmltype('order_status>shipped</order_status>')
)
as xml_order_status
from dual;
Resultado:
XML_ORDER_STATUS
<order_status>shipped</order_status>
5.2.18.1. DOM
“DOM pode ser usado para acessar dados XML armazenados em banco de
dados, e um banco e dados XML pode ser embutido com DOM como sua
interface principal para acessar e modificar dados. Porém, a interface DOM
não admite qualquer forma de consulta declarativa” (SILBERSCHATZ;
KORTH; SUDARSHAN, 2006, p 279).
5.2.18.2. SAX
O banco de dados Oracle permite índices de função, fazendo com que não
ocorra replicação de atributos entre a string XML e os atributos de
relação.
CALL write_xml_data_to_file('TEMP_FILES_DIR','cidades.xml');
set serveroutput on
exec loadxml(1,’cidade’);
COREY, Michael; ABBEY, Michael; ABRAMSON, Ian; TAUB, Ben. Oracle 8i Data
Warehouse. Rio de Janeiro: Editora Campus (Autorizado por Oracle Press), 2001.
COSTA, Rogério Luís de C. SQL: guia prático. 2. ed. Rio de Janeiro: Editora
Brasport, 2006.
INMON, Bill. Building the Data Warehouse. 2. ed. New York: Wiley Computer
Publishing, 1996.
PRICE, Jason. Oracle Database 11g SQL: Domine SQL e PL/SQL no banco de
dados Oracle. Aborda as versões 11g, 10g, 9i e 8i. Porto Alegre. Editora
Bookman, 2009.
RAMALHO, José Antonio. Oracle 10g: Ideal para quem deseja iniciar o
aprendizado do Oracle. São Paulo: Editora Pioneira Thomson Learning, 2005.
OLIVEIRA, Wilson José de. Data Warehouse. 1. ed. Florianópolis: Editora Visual
Books, 2002.
105
REFERÊNCIAS ADICIONAIS
MELO, Álvaro Nunes Lemos de; SILVA, Juliano Tonezer da Silva; CERVI,
Cristiano Roberto; PAVAN, Willingthon. PyDbDiff – uma ferramenta para
comparação de estruturas de bancos de dados. In: ESCOLA REGIONAL DE
BANCO DE DADOS – ERBD, 2, 2006, Passo Fundo, Universidade de Passo Fundo.
Anais da II Escola Regional de Banco de Dados, abril, 2006. 6 p.
MELO, Rubens Nascimento; SILVA, Sidney Dias da; TANAKA, Asterio Kyoshi.
Banco de Dados em Aplicações Cliente-Servidor. Rio de Janeiro: Editora
Infobook, 1997.
MERGEN, Sérgio Luis Sardi; HEUSER, Carlos Alberto. Ferb: um framework para
casamento de esquemas. In: ESCOLA REGIONAL DE BANCO DE DADOS –
107
SOUZA, Solange Nice Alves de; CAMPOS, Edit Grassiani Lino; SANTOS, André
Roberto Doreto dos. Uma ferramenta para a definição de consultas baseada em
entidades e papéis. Revista IEEE América Latina. v.4, junho, 2006. p. 277-282.
TANSEL, Abdullah Uz. Temporal relational data model. Revista IEEE Computer
Society (IEEE Transactions on Knowledge e Data Engineering), v.9, n.3,
may/june, 1997. p. 464-479.