III – Oracle10g Funções que Manipulam Apontadores
Tabelas Híbridas São tabelas em que colunas podem ser dos novos tipos nativos –REF –VARRAY –NESTED TABLE –Tipo definido pelo usuário Note que Tabela Híbrida –Tabelas atômicas da disciplina BD-I –“Object tables”
Regra de Integridade de Escopo Pode ser necessário declarar que um valor REF deva conter somente referências a objetos de uma “object table” específica –REF com escopo (“scoped REF”) Exemplo: tabela híbrida pessoas CREATE TABLE pessoas ( id NUMBER(4), nome VARCHAR2(60), ref_endereco REF endereço SCOPE IS endereços, fones tabela_de_fones) NESTED TABLE fones STORE AS fones_ntab
CREATE INDEX meu_indice ON pessoas (ref_endereco) SELECT id FROM pessoas p WHERE p.ref_endereco.estado = ‘PB’ Indexação de Colunas REF com Escopo Somente colunas REF com escopo podem ser indexadas Obs: Índices servem para melhorar o tempo de resposta das consultas
Funções com REF -- Tratamento de OIDs SQL> CREATE TYPE emp AS OBJECT 2 (mat NUMBER, nome VARCHAR(20), salario NUMBER) 3 / Tipo criado. SQL> CREATE TABLE emps OF emp 2 (PRIMARY KEY (mat)) 3 / Tabela criada. Obs: Exemplos com a ferramenta SQLPlus
SQL> INSERT INTO emps VALUES (10, 'Joao', 5000) 2 / 1 linha criada. SQL> -- Funcao REF (retorna um valor do tipo REF) SQL> SELECT REF(e) FROM emps e 2 / REF(E) C58AF8D AA0129C4B2F AE5 0203BB B A00000
SQL> CREATE TABLE tab_depto 2 (cod NUMBER, 3 gerente REF emp SCOPE IS emps) 4 / Tabela criada. SQL> INSERT INTO tab_depto 2 SELECT 10, REF(e) FROM emps e WHERE e.mat = 10 3 / 1 linha criada. SQL> -- Funcao DEREF SQL> SELECT DEREF(d.gerente) FROM tab_depto d WHERE d.cod = 10 2 / DEREF(D.GERENTE)(MAT, NOME, SALARIO) EMP(10, 'Joao', 5000)
SQL> SELECT DEREF(d.gerente).nome FROM tab_depto d 2 / DEREF(D.GERENTE).NOM Joao SQL> SELECT d.gerente.nome FROM tab_depto d 2 / GERENTE.NOME Joao A segunda forma é melhor do que a primeira
SQL> -- Funcao VALUE SQL> SELECT VALUE(e) FROM emps e 2 / VALUE(E)(MAT, NOME, SALARIO) EMP(10, 'Joao', 5000)
SQL> SELECT VALUE(e).nome FROM emps e 2 / VALUE(E).NOME Joao SELECT e.nome FROM emps e NOME João A segunda forma é melhor do que a primeira
REF WITH ROWID create type teste as object (x number) / tipo criado. create type teste2 as object (y REF teste) / tipo criado. create table testes of teste / tabela criada. create table testes2 of teste2 ( y WITH ROWID) / tabela criada.