540 likes | 665 Views
Conceitos de SGBD Objeto-Relacional Oracle 10g [2]. Métodos. Métodos. Programas associados aos tipos que fazem computações e podem ter acesso aos atributos do tipo Tipos de métodos Member Static Constructor Comparison (Map e Order). Member Function.
E N D
Métodos • Programasassociadosaostiposquefazemcomputações e podemteracessoaosatributos do tipo • Tipos de métodos • Member • Static • Constructor • Comparison (Map e Order)
Member Function • Métodosquepossuemacessoaos dados dainstância do objeto • Self - representa a instância do tipo no qual o método é atualmentechamado • Na declaração de um tiposãodefinidas as assinaturas dos métodos • O corpo dos métodosdeve ser criadoemalgumalinguagem de programação (PL/SQL, Java, C++)
Exemplo • CREATE TYPE T_PESSOA AS OBJECT ( NOME VARCHAR2(30), TELEFONE VARCHAR2(20), IDADE NUMBER(2), MEMBER FUNCTION GET_IDADE_PLUS RETURN NUMBER ); CREATE OR REPLACE TYPE BODY T_PESSOA AS MEMBER FUNCTION GET_IDADE_PLUS (INC NUMBER) RETURN NUMBER IS BEGIN RETURN SELF.IDADE + INC; END GET_IDADE_PLUS; END;
Constructor Method • Métodoquecriauma nova instânciapara o objeto, atribuindovaloresaosseusatributos. Trabalha com dados globais do tipo de objeto e não com a instância (não se utiliza a palavra-chave SELF) • Todo object type possui um métodoconstrutor, que é implícito e definidopelosistema • O nome do métodoconstrutor é o mesmo do object type
Exemplo • CREATE TYPE Customer_typ AS OBJECT ( id NUMBER, name VARCHAR2(20), phone VARCHAR2(30) ); cust = Customer_typ(103, 'Ravi', '555-1212')
Comparison Methods • Valores de tipos de dados primitivoscomo CHAR ou REAL possuemumaordempredefinida, permitindocompará-los • Object type possuimúltiplosatributos de diferentestipos de dados, nãopossuindo um eixodefinido de comparação • Map • Order
Map Method • Permitecompararobjetos, mapeando as instâncias dos objetosem um dos tiposescalares DATE, NUMBER, VARCHAR2
Exemplo CREATE TYPE Retangulo_tipo AS OBJECT ( larg NUMBER, comp NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER ); CREATE TYPE BODY Retangulo_tipo AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN larg * comp; END area; END;
Order Function • Realizacomparações object-to-object • É funçãoquepossui um parâmetrodeclaradoparaoutroobjeto do mesmotipo e retorna • < 0, caso o objeto SELF sejamenorque o objetopassadocomoargumento • 0, casosejamiguais • > 0, caso o objeto SELF sejamaiorque o objetopassadocomoargumento
Comando REF • REF - Retorna referência OID(object id) a uma instância da objecttable • Um objeto do tipo REF encapsula uma referência para um “rowobject” de um tipo de objeto especificado; • O valor de um objeto do tipo REF é um “ponteiro lógico” para um rowobject.
Comando REF (exemplo) • Cadastre um sócio no banco e a relacione com o endereço cujo código é 1, supondo que o endereço foi criado previamente. INSERT INTO endereco (codigo_end, rua, cep, numero, bairro) VALUES (1,'a','123',2222,'espinheiro'); INSERT INTO socio (codigo, rg, nome, ref_endereco, tipo_socio, datacadastro)VALUES (123456789,'6396327','coxinha', (selectREF(e) fromendereco e wheree.codigo_end = 1),'titular',to_date('14/08/1986','dd/mm/yyyy'));
Comando REF (exercício) • Selecionar todos os atributos de endereço que possuem alguma relação com sócio
Comando DREF • DEREF - Retorna instância de objeto correspondente ao REF • O operador DEREF executa a função oposta de REF — recebe um valor de referência e retorna o valor de um “rowobject”. O DEREF toma como argumento o OID gerado para uma referência.
Comando DREF (exemplo) • Faça uma consulta que retorno o endereço do socio com codigo123456789 select DEREF(s.ref_endereco) from socio s where s.codigo = 123456789;
Comando DREF (exercício) • Mostre todas as informações do endereço cujo código está associado ao sócio com rg igual a 6396327.
Comando Dangling • Verifica a validade de uma referência • Exemplo: • Mostre todos os socios que possuem endereços com referências inválidas. SELECT * FROM socio s WHERE s.ref_endereco IS DANGLING;
Comando Dangling (exercício) • Mostre todos os sócios que possuem endereços válidos e que moram no espinheiro.
Comando WITH ROWID • Melhor desempenho, pois fornece acesso direto ao objeto • Exemplo: • Tabela tb_socio_exemplo com referencia a endereço createtabletb_socio_exemplooftp_socio( codigoprimarykey, nome notnull, ref_enderecowithrowidreferencesendereco );
Comando WITH ROWID (exercício) • Faça uma inserção na tabela acima com um endereço válido. • Após a inserção tente remover o endereço.
Coleção de coleções - Nested com nested TURMA 1 n ALUNO PROFESSOR 1 n
Coleção de coleções - Nested com nested CREATE TYPE PROFESSOR_TYPE AS OBJECT ( NOME VARCHAR2(15), DISCIPLINA VARCHAR2(15) ); //Nested professor_typequeserá um atributodatabela //aluno CREATE TYPE NT_PROF_T AS TABLE OF PROFESSOR_TYPE;
Coleção de coleções - Nested com nested //Type alunopossue um conjunto de professores CREATE TYPE ALUNO_TYPE AS OBJECT( MATRICULA NUMBER, PROFESSORES NT_PROF_T ); //Nested de aluno, o qual já possue um conjunto como //atributo CREATE TYPE NT_ALUNO_T AS TABLE OF ALUNO_TYPE;
Coleção de coleções - Nested com nested CREATE TYPE TURMA_TYPE AS OBJECT ( CODIGO VARCHAR2(3), SALA VARCHAR2(3), ALUNOS NT_ALUNO_T ); CREATE TABLE TURMA_TAB OF TURMA_TYPE ( CODIGO PRIMARY KEY ) NESTED TABLE ALUNOS STORE AS ALUNOS_T (NESTED TABLE PROFESSORES STORE AS PROF_T);
Coleção de coleções - Nested com nested • Sintaxe para inserção de aluno e professor INSERT INTO TURMA_TAB VALUES ('I5A', ‘D005', NT_ALUNO_T( ALUNO_TYPE(210141500, NT_PROF_T( PROFESSOR_TYPE(‘Manoel',‘Sistemas Digitais'), PROFESSOR_TYPE(‘Ruy',‘Logica') ) ),
Coleção de coleções - Nested com nested • Sintaxe para inserção de aluno e professor (continuação) ALUNO_TYPE(210141750, NT_PROF_T( PROFESSOR_TYPE('Silvio','HFC'), PROFESSOR_TYPE('Hermano','PLP') ) ) )--nt_aluno_t );--insert
Coleção de coleções - Nested com nested • Sintaxe para inserção apenas de professor INSERT INTO TABLE( SELECT A.PROFESSORES FROM TABLE ( SELECT FROM TURMA_TAB T WHERE T.CODT.ALUNOS IGO = 'I5A‘ ) A WHERE A.MATRICULA = 210141750) VALUES (‘Fernando’,’GDI’);
Coleção de coleções - Nested com nested • Atualizando o professor da disciplina Projetão (PD). UPDATE TABLE( SELECT A.PROFESSORES FROM TABLE( SELECT T.ALUNOS FROM TURMA_TAB T WHERE T.CODIGO = 'I5A‘ ) A WHERE A.MATRICULA = 210141500 ) P SET VALUE(P)= PROFESSOR_TYPE('Jacques','PD') WHERE P.DISCIPLINA='PD';
Coleção de coleções - Nested com nested • Consulta em tabela aninhada SELECT P.NOME, P.DISCIPLINA FROM TURMA_TAB T, TABLE(T.ALUNOS) A, TABLE(A.PROFESSORES) P WHERE T.CODIGO = ‘I5A’ ;
Coleção de coleções - Nested com varray ALUNO 1 matricula n PROFESSOR telefone nome diciplina
Coleção de coleções - Nested com varray • Table CREATE TABLE tb_aluno OF aluno_tp ( CONSTRAINT pk_aluno PRIMARY KEY (matricula) ) NESTED TABLE conj_professores STORE AS prof_nt; / commit; /
Coleção de coleções - Nested com varray • Insert com e sem elementos na nested ;
Coleção de coleções - Nested com varray • Consulta
Coleção de coleções - Varray com varray • Um computador possui vários componentes; • Cada existem várias marcas diferentes para um componente; • Cada marca possui um preço diferente por componente. CREATE OR REPLACE TYPE tp_marca AS OBJECT ( nome VARCHAR2(20), preco NUMBER); / CREATE OR REPLACE TYPE vr_marca AS VARRAY(10) OF tp_marca; / CREATE OR REPLACE TYPE tp_componente AS OBJECT ( descricao VARCHAR2(40), marcas vr_marca); / CREATE OR REPLACE TYPE vr_componente AS VARRAY(30) OF tp_componente; / CREATE OR REPLACE TYPE tp_computador AS OBJECT ( descricao VARCHAR2(50), componentes vr_componente ); / CREATE TABLE tb_computador OF tp_computador(CONSTRAINT pk_computador PRIMARY KEY (id));
Coleção de coleções - Varray com varray INSERT INTO tb_computador VALUES( 1, 'Computador ID#1', vr_componente( tp_componente( 'Processador', vr_marca( tp_marca('Intel',1200), tp_marca('AMD', 999) )), tp_componente( 'Placa de Video', vr_marca( tp_marca('NVIDIA', 800), tp_marca('ATI', 700) ))));
Coleção de coleções - Varray com varray SELECT C.descricao, m.nome, m.preco from tb_computador T, TABLE(T.componentes) C, TABLE(C.marcas) M; DESCRICAO NOME PRECO ---------------------------------------- -------------------- ---------- Processador Intel 1200 Processador AMD 999 Placa de Video NVIDIA 800 Placa de Video ATI 700
JDBC • Conjunto de interfaces e classes java que faz envio de consultas para um banco de dados. • Objetos(tipos) • Conexão (Driver e Connection) • SQL para JDBC • Midias
JDBC - Tipos • Driver – interface utilizada por toda aplicação que precise acessar um BD. • Connection – conexão com BD. Obtida á partir de um Driver já carregado. • Statement e PreparedStatement –. interfaces que representam as consultas. • ResultSet – interface que recebe o resultado de uma consulta.
JDBC - Driver • Essencial (carregamento obrigatório) para estabelecer uma conexão com BD. • Class.forName (String driver_name) ; -> determina qual drive será usado. Esse comando registra o driver. *no DriverManager (classe responsável pelo gerenciamento de drivers carregados). *driver_name fornecido pelo provedor do BD. • getConnection(String url_driver, String user_bd, String password_bd) ; -> método que acessa a tabela de drivers (DriverManager) com a url (do driver) passada e depois cria e retorna uma conexão com o BD.
JDBC - Driver e Connection • String user = "eq01"; • String password = "equipe1"; • String url_driver = "jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc"; • Class.forName("oracle.jdbc.driver.OracleDriver"); • Como dito anteriormente, obtemos uma conexão SOMENTE APÓS registrar um driver no DriveManager. • Connection connection = DriveManager.getConnection(url_driver, user, password) ;
JDBC - Driver e Connection • try { • Class.forName("oracle.jdbc.driver.OracleDriver"); • con = DriverManager.getConnection(url, user, password); • } catch (SQLException e) • { • JOptionPane.showMessageDialog(null, e.getMessage()); • } • connection.commit( ); • connection.rollback( ); • connection.close( ); *aconteceu comigo. Fiz várias consultas e travou depois de um tempo
JDBC - Statement • Statement -> armazenam consultas que sempre são compiladas antes de serem executadas. * connection.createStatement(); - retorna um Statement. dml->linguagem de modelagem (ins,del,upd) ddl ->linguagen de definicao(create, drop) * statement.executeUpdate(String sql_dml_ddl); - realisa uma operação e retorna a quantidade de linhas modificadas. *statement.executeQuery(String sql_select); -realisa uma operação que retorna um ResultSet.
JDBC - Statement e ResultSet • Statement stmt = connection.createStatement(); String sql1 = “SELECT * FROM FROM Fornecedor”; ResultSet rs = stmt.executeQuery(sql1); while(rs.next()){ nome = rs.getString(“NOME”); } *** rs.getTYPE_NAME(); String sql2 = “INSERT INTO Fornecedor VALUES” + “ (‘123456-7’, ’Info’ )”; stmt.executeUpdate(sql2);
JDBC - PreparedStatement • PreparedStatement - é um Statement que é compilado apenas na primeira execução. * connection.prepareStatement(String sql); -retorna um PreparedStatement. * **setType_name(); -seta valores onde existe ‘?’ no sql criado. public static final String INSERIR_FORNECEDOR_1_FONE = “INSERT INTO tb_fornecedor (nome, cnpj, array_tp_fone, ” + “nt_pedido_fornecedor, nt_produto ) VALUES (?,?,” + “array_tp_fone(tp_telefone(?,?)), nt_pedido_fornecedor(), nt_produto);” ;