Monday, January 11, 2010

Object Tables - Exemplos usando Oracle 10gR2(10.2.0.4)

Alguém já usou object tables no Oracle?

Vou mostrar alguns exemplos  usando Oracle 10g.

Object table nada mais é que uma tabela criada com base em um tipo definido pelo usuário ou user-defined types um conceito bem conhecido das famosas Classes em Orientação a Objetos popular OO.

Desde a versão 8 do Oracle é possível trabalhar com OO nos códigos PL/SQL e armazenamento dentro do banco de dados.Da versão 8 até a versão atual 11g estas características foram melhoradas.Podemos trabalhar com conceito de classe,atributos e métodos bem como herança ,funções e contrutores dentre outras.

Uma vez definido um TYPE podemos utilizá-los de várias formas e  entre elas a de criar tabelas com base em tipos.

Criando um object type :

dbajcc@OCADB on 11-JAN-10 >create type t_dbf as object(file_name varchar2(50),tablespace_name varchar2(30));
  2  /
Type created.
Elapsed: 00:00:00.38


Criando uma object table :

dbajcc@OCADB on 11-JAN-10 >create table tst_dbf_obj of t_dbf ;
Table created.
Elapsed: 00:00:00.70

Inserindo dados em uma object table :

dbajcc@OCADB on 11-JAN-10 >insert into tst_dbf_obj select file_name,tablespace_name from dba_data_files ;
6 rows created.
Elapsed: 00:00:00.04

dbajcc@OCADB on 11-JAN-10 >commit;
Commit complete.
Elapsed: 00:00:00.02



dbajcc@OCADB on 11-JAN-10 >select * from tst_dbf_obj ;

FILE_NAME                                          TABLESPACE_NAME
-------------------------------------------------- ---------------
+DATA/ocadb/datafile/users.263.703360157           USERS
+DATA/ocadb/datafile/sysaux.259.703360021          SYSAUX
+DATA/ocadb/datafile/undotbs1.260.703360021        UNDOTBS1
+DATA/ocadb/datafile/system.257.703360021          SYSTEM
+DATA/ocadb/datafile/example.261.703360021         EXAMPLE
+DATA/ocadb/datafile/teste_rename.262.703360117    TESTE_RENAME

6 rows selected.
Elapsed: 00:00:00.01

Também é possível criar constraints em object tables tais como Primary Keys (PK's) e Check constraints .

No exemplo abaixo vamos criar uma object table com uma coluna identificadora :

dbajcc@OCADB on 11-JAN-10 >create type t_automovel as object (id number(2),nome varchar2(10),marca varchar2(15));
  2  /
Type created.
Elapsed: 00:00:00.05
 
dbajcc@OCADB on 11-JAN-10 >
dbajcc@OCADB on 11-JAN-10 >create table frota_taxi of t_automovel (id PRIMARY KEY)
  2  object identifier is primary key ;
Table created.
Elapsed: 00:00:00.13
dbajcc@OCADB on 11-JAN-10 >

Você NÃO PODE excluir um TYPE caso exista um outro objeto definido com base nele :

dbajcc@OCADB on 11-JAN-10 >drop type t_automovel ;
drop type t_automovel
*
ERROR at line 1:
ORA-02303: cannot drop or replace a type with type or table dependents
Elapsed: 00:00:00.02

Pirmeiro excluímos os dependentes e depois  eliminamos  o tipo:

dbajcc@OCADB on 11-JAN-10 >drop table frota_taxi ;
Table dropped.
Elapsed: 00:00:00.81
dbajcc@OCADB on 11-JAN-10 >drop type t_automovel ;
Type dropped.
Elapsed: 00:00:00.58
dbajcc@OCADB on 11-JAN-10 >

Podemos fazer o uso das object tables que possuem colunas que também  são objetc types   :

dbajcc@OCADB on 11-JAN-10 >create type t_bolas_sena
as object (first number(2),second number(2),third number(2),
           fourth number(2),fifth number(2),sixth number(2)) ;
/  2    3    4
Type created.
Elapsed: 00:00:00.06
dbajcc@OCADB on 11-JAN-10 >
--criar um objeto com os atributos de um resultado de jogo da mega sena
 
dbajcc@OCADB on 11-JAN-10
create type t_resultado_sena
as object( concurso number(4),
           local_sorteio varchar2(50),
            bolas_sena  t_bolas_sena ) ;
/dbajcc@OCADB on 11-JAN-10 >dbajcc@OCADB on 11-JAN-10 >  2    3    4    5
Type created.
Elapsed: 00:00:00.05
dbajcc@OCADB on 11-JAN-10 >
 
--criação de uma object table que armazena o type  t_resultado_sena
 
dbajcc@OCADB on 11-JAN-10 >
create table tb_resultado_sena of t_resultado_sena ;
/dbajcc@OCADB on 11-JAN-10 >dbajcc@OCADB on 11-JAN-10 >
Table created.
Elapsed: 00:00:00.05

dbajcc@OCADB on 11-JAN-10 >insert into  tb_resultado_sena
values(t_resultado_sena(1141,
                       'TRAMANDAI/RS',
           t_bolas_sena(09,37,40,50,58,60)
                           )
           ) ;  2    3    4    5    6
1 row created.
Elapsed: 00:00:00.01
 
dbajcc@OCADB on 11-JAN-10 >insert into  tb_resultado_sena
(concurso,local_sorteio,bolas_sena)
values(1142,'PENEDO/AL',
           t_bolas_sena(03,15,26,28,31,58)
      ) ;  2    3    4    5
1 row created.
Elapsed: 00:00:00.00
 
 
dbajcc@OCADB on 11-JAN-10 >
dbajcc@OCADB on 11-JAN-10 >commit ;
Commit complete.
Elapsed: 00:00:00.01
dbajcc@OCADB on 11-JAN-10 >

dbajcc@OCADB on 11-JAN-10 >select * from tb_resultado_sena tbs where tbs.concurso = 1142 ;
  CONCURSO LOCAL_SORTEIO
---------- --------------------------------------------------
BOLAS_SENA(FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1142 PENEDO/AL
T_BOLAS_SENA(3, 15, 26, 28, 31, 58)
Elapsed: 00:00:00.03

dbajcc@OCADB on 11-JAN-10 >select * from tb_resultado_sena ;

  CONCURSO LOCAL_SORTEIO
---------- --------------------------------------------------
BOLAS_SENA(FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1141 TRAMANDAI/RS
T_BOLAS_SENA(9, 37, 40, 50, 58, 60)

      1142 PENEDO/AL
T_BOLAS_SENA(3, 15, 26, 28, 31, 58)
Elapsed: 00:00:00.02

Dúvidas ou sugestões ?Poste o seus comentários!

Abs,

Julio Cesar Correa

No comments: