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 Métodos que possuem acesso aos dados da instância do objeto Self - representa a instância do tipo no qual o método é atualmente chamado Na declaração de um tipo são definidas as assinaturas dos métodos O corpo dos métodos deve ser criado em alguma linguagem 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étodo que cria uma nova instância para o objeto, atribuindo valores aos seus atributos. 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étodo construtor, que é implícito e definido pelo sistema O nome do método construtor é 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 primitivos como CHAR ou REAL possuem uma ordem predefinida, permitindo compará-los Object type possui múltiplos atributos de diferentes tipos de dados, não possuindo um eixo definido de comparação Map Order
Map Method Permite comparar objetos, mapeando as instâncias dos objeto sem um dos tipos escalares 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 Realiza comparações object-to-object É função que possui um parâmetro declarado para outro objeto do mesmo tipo e retorna < 0, caso o objeto SELF seja menor que o objeto passado como argumento 0, caso sejam iguais > 0, caso o objeto SELF seja maior que o objeto passado como argumento
Manipulação de Consultas
Comando REF REF - Retorna referência OID(object id) a uma instância da object table Um objeto do tipo REF encapsula uma referência para um “row object” de um tipo de objeto especificado; O valor de um objeto do tipo REF é um “ponteiro lógico” para um row object.
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', (select REF(e) from endereco e where e.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 “row object”. 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 codigo 123456789 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.
SELECT * FROM socio s WHERE s.ref_endereco IS DANGLING; 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 create table tb_socio_exemplo of tp_socio( codigo primary key, nome not null, ref_endereco with rowid references endereco );
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ções de coleções
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_type que será um atributo da tabela //aluno CREATE TYPE NT_PROF_T AS TABLE OF PROFESSOR_TYPE;
Coleção de coleções - Nested com nested //Type aluno possue 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 Types
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
Conceitos de Conectividade JDBC
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 - é 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);” ;
JDBC - PreparedStatement
JDBC - PreparedStatement
JDBC - PreparedStatement
Transformar um arquivo entrada em um stream de entrada
JDBC - Mídia