Objetos no Oracle Marilde Santos Aula dia 2105
Objetos no Oracle Marilde Santos
• Aula dia 21/05
Novos termos: Objeto (Object type) Classe Instância (Object Instance) Instância de uma classe, ou seja, um objeto Herança (Objecttype inheritance) Mecanismo que permite criar uma classe aproveitando uma já existente. (a partir do 9 i) Atributo (Attribute) Propriedade de um objeto. Pode ser de algum tipo prédefinido ou mesmo uma classe. Método (Method) Rotina incorporada ao Objeto.
Views referentes a POO: ALL_COLL_TYPES DBA_TYPES ALL_METHOD_PARAMS DBA_TYPE_ATTRS ALL_METHOD_RESULTS DBA_TYPE_METHODS ALL_OBJECT_TABLES USER_COLL_TYPES ALL_TYPES USER_METHOD_PARAMS ALL_TYPE_ATTRS USER_METHOD_RESULTS ALL_TYPE_METHODS USER_OBJECT_TABLES DBA_COLL_TYPES USER_TYPES DBA _METHOD_PARAMS USER_TYPE_ATTRS DBA_METHOD_RESULTS USER_TYPE_METHODS DBA _OBJECT_TABLES USER_OBJECTS (*) SOMENTE AS ESPECIFICAÇÕES E CORPOS DAS CLASSES.
Object Type Duas etapas: 1. Especificação 2. Corpo • Sintaxe para especificação: CREATE OR REPLACE TYPE nome_classe AS OBJECT (lista de atributos, lista de métodos)
Exemplo – Especificação create or replace type funcionario_t as object( -- atributos: matricula varchar 2(10), nome varchar 2(60), data_nascimento date, --metodos de acesso a dados: member procedure set_matricula (new_matricula in varchar 2), member procedure set_nome (new_nome in varchar 2), member procedure set_data_nascimento (new_data_nascimento in date), --demais metodos: member function retorna_idade return integer, member procedure mostre ) not final; /
Exemplo – Especificação create or replace type funcionario_t as object( -- atributos: matricula varchar 2(10), nome varchar 2(60), Somente a partir do data_nascimento date, Oracle 9 i!! --metodos de acesso a dados: Pode vir(new_matricula a ter member procedure set_matricula in varchar 2), classes derivadas! member procedure set_nome (new_nome in varchar 2), member procedure set_data_nascimento (new_data_nascimento in date), --demais metodos: member function retorna_idade return integer, member procedure mostre ) not final; /
Dicas • Para confirmar a criação da classe: Select type_name, attributes, methods from user_types; • Para eliminar uma classe: DROP TYPE nome_classe;
Exemplo – Corpo (1) create or replace type body Funcionario_t as --metodos de acesso a dados: member procedure set_matricula (new_matricula in varchar 2) is begin matricula : = new_matricula ; end; member procedure set_nome (new_nome in varchar 2) is begin self. nome : = new_nome ; end;
Exemplo – Corpo (2) member procedure set_data_nascimento (new_data_nascimento in date) is Representa a begin instância que estiver self. data_nascimento : = new_data_nascimento ; utilizando o código. end; -- mostra atributos member procedure mostre is begin dbms_output. put_line ('matricula: '|| matricula); dbms_output. put_line ('nome: '|| nome); dbms_output. put_line ('data nascimento: '|| to_char(data_nascimento)); end;
Exemplo – Corpo (3) -- calcula a idade member function retorna_idade return integer is begin return trunc(sysdate-data_nascimento)/365; end; /
Dicas • Usando a User_objects para visualizar as classes criadas: Column object_name format a 20 Select object_name, object_type from user_objects Where object_name like ‘%FUNCIONARIO%’;
Instanciando um objeto create or replace procedure cria_funcionario is p funcionario_t; /* declaração de uma variável objeto */ begin /* Instanciando. . . */ p : = funcionario_t ('0001', 'Caio', to_date('2001/01/12’, ’yyyy/mm/dd’)); /* Invocando métodos. . . */ p. mostre; dbms_output. put_line(' alterando. . . '); p. set_nome('Caio Prado Santos'); p. mostre; /* existe um argumento "in out" implícito: self */ dbms_output. put_line('idade: ' || p. retorna_idade); end; /
Executando… SQL> set serveroutput on; SQL> exec cria_funcionario; matricula: 0001 nome: Caio data nascimento: 2001 -01 -12 alterando. . . matricula: 0001 nome: Caio Prado Santos data nascimento: 2001 -01 -12 idade: 3 create or replace procedure cria_funcionario is p funcionario_t; begin /* Instanciando. . . */ p : = funcionario_t ('0001', 'Caio', to_date('2001/01/12'); p. mostre; dbms_output. put_line(' alterando. . . '); p. set_nome('Caio Prado Santos'); p. mostre; dbms_output. put_line('idade : ' || p. retorna_idade); end; / PL/SQL procedure successfully completed.
Tabela de Objetos • Sintaxe: CREATE TABLE funcionarios OF funcionario_t (primary key (matricula)); • Alimentando a tabela: Insert into funcionarios values ( Funcionario_t(‘ 001’, ’Murilo Massoco’, to_date(‘ 2004/03/11’))); • Visualizando o dado: SQL> column nome format a 15 SQL> select * from funcionarios; MATRICULA NOME DATA_NASCIMENTO -----001 ------------Murilo Massoco 2004 -03 -11
Script para alimentação: insert into funcionarios values (funcionario_t('001', 'Alvaro Alpheratz', to_date('12/09/68'))); insert into funcionarios values (funcionario_t('002', 'Bernardo Beid', to_date('7/01/76'))); insert into funcionarios values (funcionario_t('003', 'Carla Caph', to_date('22/04/80'))); insert into funcionarios values (funcionario_t('004', 'Daniel Dheneb', to_date('10/06/79'))); insert into funcionarios values (funcionario_t('005', 'Efraim Eltanin', to_date('31/10/83'))); Corrigir insert into funcionarios values (funcionario_t('006', 'Francisca Fomalhaut', to_date('1/02/71'))); formatos de insert into funcionarios values (funcionario_t('007', 'Guilherme datas!! Gomeisa', to_date('15/12/86'))); insert into funcionarios values (funcionario_t('008', 'Horácio Hyadum', to_date('23/03/72'))); insert into funcionarios values (funcionario_t('009', 'Inácio Izar', to_date('30/11/84'))); insert into funcionarios values (funcionario_t('010', 'João Jabbah', to_date('6/05/55'))); commit;
• Select nome, f. retorna_idade() idade • From funcionarios f;
Referências a outros objetos • Uma tabela de objetos pode possuir um campo que seja uma referência a uma instância que conste de uma tabela de objetos. – Como uma chave estrangeira!
Exemplo referência (1) create or replace type projeto_t as object( cod_projeto varchar 2(10), descricao varchar 2(60), urgencia number(2), ref_responsavel ref funcionario_t, member procedure set_cod_projeto (new_cod_projeto in varchar 2), member procedure set_descricao (new_descricao in varchar 2), member procedure set_urgencia (new_urgencia in number), member procedure mostre );
Exemplo referência (2) create or replace type body projeto_t as --metodos de acesso a dados: member procedure set_cod_projeto (new_cod_projeto in varchar 2) is begin cod_projeto : = new_cod_projeto ; end; member procedure set_descricao (new_descricao in varchar 2) is begin descricao : = new_descricao ; end;
Exemplo referência (3) member procedure set_urgencia (new_urgencia in number) is begin urgencia : = new_urgencia ; end; -- mostra atributos member procedure mostre is begin dbms_output. put_line ('código: '|| cod_projeto); dbms_output. put_line ('descrição: '|| descricao); dbms_output. put_line ('urgência: '|| to_char(urgencia)); end;
Exemplo referência (4) Drop table projetos -- cria a tabela: create table projetos of projeto_t (primary key (cod_projeto)); -- alimenta a tabela: insert into projetos select projeto_t('001', 'Exportação de sapatos para Ásia', 9, ref(f)) from funcionarios f where matricula = '001'; insert into projetos select projeto_t('002', 'Fabricação de solas de borracha', 6, ref(f)) from funcionarios f where matricula = '002';
Exemplo referência (5) insert into projetos values (projeto_t('003', 'Implantação de cursos WEB', 7, null)); insert into projetos values (projeto_t('004', 'Aquisição de matérias primas', 8, null)); insert into projetos values (projeto_t('005', 'Montagem de embalagens', 7, null)); insert into projetos select projeto_t('006', 'Vendas no mercado interno', 6, ref(f)) from funcionarios f where matricula = '001'; commit;
Exemplo referência (6) -- Resolvendo inconsistências: update projetos set ref_responsavel = null where ref_responsavel is dangling; O Oracle não proíbe que objetos referenciados possam ser eliminados. Esse comando contorna esse problema.
Apresentando o conteúdo… SQL> 2 3 column descricao format a 20 column nome format a 20 select descricao, f. nome from projetos p, funcionarios f where p. ref_responsavel=ref(f); DESCRICAO ----------Exportação de sapato s para Ásia NOME ----------Murilo Massoco Vendas no mercado in terno Murilo Massoco
Tabelas aninhadas Campos de tabelas não precisam mais ser variáveis de tipos primitivos, que comportam apenas um valor: • Podem ser objetos • Podem ser lista – um repositório homogêneo de elementos – Um campo vetor. Como fazer: • Cria-se um tipo como tabela • Atribui-se esse tipo ao atributo que se deseja tratar como um vetor • Na tabela que for construída com esse novo tipo deve-se dizer que existe uma tabela aninhada
Tabelas Aninhadas Nested Table drop table funcionarios; drop table projetos; drop type projeto_t; create or replace type dependentes_t as table of varchar 2(20); create or replace type funcionario_t as object( matricula varchar 2(10), nome varchar 2(60), data_nascimento date, dependentes_t, member procedure set_matricula (new_matricula in varchar 2), member procedure set_nome (new_nome in varchar 2), member procedure set_data_nascimento (new_data_nascimento in date), member function retorna_idade return integer, member procedure mostre); start Cria_Classe_Funcionario_Body / Transp. 7.
Tabelas Aninhadas Nested Table -- cria a tabela funcionarios que possui um campo objeto aninhado drop table funcionarios; create table funcionarios of funcionario_t (primary key (matricula)) nested table dependentes store as dependentes_st; insert into funcionarios values (funcionario_t('001', 'Alvaro Alpheratz', to_date('12/09/1968'), dependentes_t('Maria', 'Pedro', 'Hugo')));
insert into funcionarios values (funcionario_t('002', 'Bernardo Beid', to_date('7/01/1976'), null)); insert into funcionarios values (funcionario_t('003', 'Carla Caph', to_date('22/04/1980'), dependentes_t('Antonio'))); insert into funcionarios values (funcionario_t('004', 'Daniel Dheneb', to_date('10/06/1979'), null)); insert into funcionarios values (funcionario_t('005', 'Efraim Eltanin', to_date('31/10/1983'), null)); insert into funcionarios values (funcionario_t('006', 'Francisca Fomalhaut', to_date('1/02/1971'), dependentes_t('Francisco', 'Laura'))); insert into funcionarios values (funcionario_t('007', 'Guilherme Gomeisa', to_date('15/12/1986'), null)); insert into funcionarios values (funcionario_t('008', 'Horácio Hyadum', to_date('23/03/1972'), dependentes_t('Sara', 'Mário', 'Mônica', 'João Pedro'))); insert into funcionarios values (funcionario_t('009', 'Inácio Izar', to_date('30/11/1984'), null)); insert into funcionarios values (funcionario_t('010', 'João Jabbah', to_date('6/05/1955'), null)); commit;
Listando. . . SQL> select dependentes from funcionarios where matricula='001'; DEPENDENTES ----------------------------------------DEPENDENTES_T('Maria', 'Pedro', 'Hugo') SQL> select column_value Dependentes from the 2 (select dependentes from funcionarios where matricula='001'); DEPENDENTES ----------Maria Pedro Hugo
Vetores create or replace type dependentes_t as table of varchar 2(20); -- Esta lista armazenará os nomes dos pais, avós paternos e avós maternos create or replace type ascendentes_t as varray(6) of varchar 2(20); create or replace type funcionario_t as object( -- atributos: matricula varchar 2(10), nome varchar 2(60), data_nascimento date, dependentes_t, ascendentes_t, --metodos de acesso a dados: member procedure set_matricula (new_matricula in varchar 2), member procedure set_nome (new_nome in varchar 2), member procedure set_data_nascimento (new_data_nascimento in date), --demais metodos: member function retorna_idade return integer, member procedure mostre
Vetores create or replace type dependentes_t as table of varchar 2(20); -- Esta lista armazenará os nomes dos pais, avós paternos e avós maternos create or replace type ascendentes_t as varray(6) of varchar 2(20); Variável, mas no máximo 6 create or replace type funcionario_t as object( -- atributos: matricula varchar 2(10), nome varchar 2(60), data_nascimento date, dependentes_t, ascendentes_t, --metodos de acesso a dados: member procedure set_matricula (new_matricula in varchar 2), member procedure set_nome (new_nome in varchar 2), member procedure set_data_nascimento (new_data_nascimento in date), --demais metodos: member function retorna_idade return integer, member procedure mostre
Visualizando. . . SQL> select column_value Ascendentes 2 from the 3 (select cast(ascendentes as dependente_t) 4 from funcionarios 5 where matricula='001'); ASCENDENTES ----------Enrique Guillermina Eduardo Marta Alberto Albertina 6 rows selected. Força que ascendente seja convertido para o formato de dependente_t
Visualizando. . . (2) SQL> select ascendentes 2 from funcionarios where matricula='001'; ASCENDENTES -------------------------------------ASCENDENTES_T('Enrique', 'Guillermina', 'Eduardo', 'Marta', 'Alberto', 'Albertina')
Visualizando. . . (3) SQL> select column_value Ascendentes 2 from the 3 (select ascendentes from funcionarios where matricula='001'); ASCENDENTES ----------Enrique Guillermina Eduardo Marta Alberto Albertina 6 rows selected.
Vetor de Objeto Complexo create or replace type fone as object ( DDD char(3), prefixo char(4), numero char(4) ); create or replace type fones as varray(3) of fone; create or replace table aluno ( ra char(6) not null, nome varchar(15) not null, telefones, primary key(RA));
Insere e Atualiza Vetor insert into aluno(RA, nome, telefones) values ('123456', 'MARILIA', fones(fone('016', '272', '1963'))); update aluno set telefones=fones(fone('016', '272', '1963'), fone('019', '3362', '2343')) where RA='123456';
Consultando Vetor "Busque os telefones do aluno cujo ra='123456'" SQL> select telefones from aluno where ra='123456'; TELEFONES(DDD, PREFIXO, NUMERO) ----------------------------------------FONES(FONE('016', '272 ', '1963'), FONE('019', '3362', '2343')) SQL> select * from table(select telefones from aluno) ; DDD PREF NUME ---- ---016 272 1963 019 3362 2343
Consultando Vetor “Liste o nome dos alunos e seus respectivos telefones” SQL> Select aluno. nome, tel. * from aluno, table(select telefones from aluno) tel; NOME DDD PREF NUME -------- ---MARILIA 016 272 1963 MARILIA 019 3362 2343
Consultando Vetor "Busque os prefixos e os números de telefones daqueles estudantes que possuem telefone na cidade cujo ddd='019'" SQL> select prefixo, numero from table(select telefones from aluno) where ddd='019'; PREF NUME ---- ---3362 2343
Tabela aninhada de objeto complexo create or replace type disciplinas as object ( nome varchar(30), nota integer); create or replace type disciplina as table of disciplinas; create table estudante (ra char(6) not null, nome varchar(15) not null, materia disciplina, primary key (RA) ) nested table materia store as materia_st;
Inserção e Atualização em Tabela aninhada insert into estudante values ('123456', 'denise', disciplina(disciplinas('BD', 10), disciplinas('ES', 9))); insert into table(select materia from estudante where ra='123456') values(‘ED', 4); update table(select materia from estudante where ra='123456') set nota=10 where nome='BD'; delete table(select materia from estudante where ra='123456') where nome='BD';
Atualização e Consulta em Tabela aninhada SQL> update table(select materia from estudante where ra='123456') set nota=10 where nome='ES'; 1 row updated. SQL> select estudante. ra, estudante. nome, mat. * 2 from estudante, 3 table(select materia from estudante) mat; RA NOME NOTA ----------------123456 denise ES 10 123456 denise ED 4
Consultando Tabela aninhada "Busque a nota obtida pelo estudante cujo RA='123456' na disciplina 'Engenharia de Software'" SQL> select nota from table(select materia from estudante where ra='123456') where nome='ES'; NOTA -----10
Consultando Tabela aninhada "Busque as disciplinas e as respectivas notas do estudante cujo RA='123456'" SQL> select * from table(select materia from estudante where ra='123456'); NOME NOTA ---------------ES 10 ED 4
- Slides: 45