Capítulo 11 JDBC.

Slides:



Advertisements
Apresentações semelhantes
Banco de Dados Prof. Antonio.
Advertisements

JDBC Java Dababase Connectivity Marco Antonio, Arquiteto de Software – TJDF Atualizado em Novembro/2008.
Prof. Alessandro J. de Souza
Prof.: Bruno Rafael de Oliveira Rodrigues
Java Conexão com Banco de Dados
APLICAÇÕES DE LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS ACESSO A BANCO DE DADOS COM O JDBC Prof. Thiago Pereira Rique
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
Sistemas de Informação Redes de Computadores
28.5 Instruções para instalar o MySQL e o MySQL Conector/J
Maurício Edgar Stivanello
Sistema Gerenciador de Banco de Dados SGBD
Linguagens de Programação Orientadas a Objetos
Sumário 1 Processamento de Consultas 2 Introdução a Transações
Introdução à Engenharia da Computação
Material III-Bimestre Wagner Santos C. de Jesus
Sistemas de Informação
Introdução a JDBC Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
B ANCO DE D ADOS E JDBC Profa. Msc. Cintia Carvalho Oliveira Mestre em Ciência da Computação – UFU Bacharel em Ciência da Computação - UFJF 1.
Banco de dados Profª Kelly Medeiros.
Java & Bancos de Dados Universidade Salgado de Oliveira Goiânia
Java :: Persistência de Dados
Acesso a Base de Dados JDBC Trabalho Realizado por:
Conexão com Bancos de Dados Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense.
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Integração com Banco de Dados
Design Patterns / Acesso ao banco de dados (java.sql)
Programação Orientada a objetos II
Anexo A. JDBC  Conjunto de interfaces e classes java que faz envio de consultas para um banco de dados.  Objetos(tipos)  Conexão (Driver e Connection)
JSP / Servlets Avançado
P ROGRAMAÇÃO Prof.: Bruno Rafael de Oliveira Rodrigues.
Desenvolvendo um script SQL
JDBC Java Database Connectivity. JDBC Especificação para uso de base de dados em aplicações e applets JAVA; API para uso de drivers JDBC; Compatível com.
Desnvolvimento de Projetos e Aplicações Web Ceça Moraes – Ceça.
Linguagem de Definição de Dados
Curso Programação – JAVA Centro de Formação São Domingos
Programação Orientada à Objetos
Configuração do Ambiente de programação
Capítulo 6 Exceções.
Programação para Web Unidade 06 – Java Beans e BDs Prof.: Henrique Santos.
Projeto de Sistemas de Informação Prof. Schneider Oracle Object-Relational.
1 15/4/ :36 FMU – 1. Semestre – Tecnologia – Analise e Desenvolvimento de Sistemas Professor: Eduardo Silvestri Aluno:Clóvis de Oliveira- RA
Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana
CURSO JAVA BÁSICO Módulo JDBC – slide 1 MóduloJDBC.
Java Conexão com Baco de dados Saulo Bazzi Oberderfer Fonte:
Banco de Dados I I Comandos SQL
Fundamentos de Banco de Dados Fundamentos de Banco de Dados Prof. Gale 2º. Semestre 2008.
DELETE, UPDATE, COMMIT, ROLLBACK
7P/SI – 2010/01 Prof. Carlos Alberto Seixas. Agenda Visão Geral sobre os Conceitos e Implementação sobre SGBs MySQL Revisão das Práticas Práticas 1 e.
JDBC Java Database Connectivity docs/guide/jdbc/getstart/introTOC.doc.html.
Conceitos básicos Professor Esp. Diego André Sant’Ana
J AVA D ATABASE C ONNECTIVITY JDBC. JDBC O Java Database Connectivity (JDBC) API é o padrão da indústria para que aplicações Java acessem bancos de dados.
Leo Silva Leonardo Murta Luiz Viana Persistência em Java.
Java Acesso a Banco de Dados Prof. Marcos André Pisching, M.Sc.
Acesso a Banco de Dados com JDBC e DAO
Desenvolvimento WEB II Aula 3 – Conexão com o Banco de Dados
Acessando banco de dados com JAVA.  Linguagem independente de plataforma; ◦ “Write once, run anywhere” ◦ JVM  Java Virtual Machine  Mecanismo que permite.
Desenvolvimento WEB II Professora: Kelly de Paula Cunha.
Banco de Dados -Aprendendo conceitos -Usando o SQL Conf para:
Java Módulo II Projeto Final.
JavaServer Faces – JSF Fernando Freitas Costa Bacharel em Sistemas de Informação Especialista em Gestão e Docência Universitária blog.fimes.edu.br/fernando.
Persistência de dados e padrão DAO
2/6/2016 José Antônio da Cunha - CEFET - RN1 Programação de Banco de Dados Funções.
Banco de Dados Prof. MSc Wagner Siqueira Cavalcante.
Banco de Dados Relacionais. Tabelas DB Relacionais são baseados em tabelas As tabelas armazenam registros Cada registro ocupa uma linha da tabela Registros.
Prof.: Jean Carlo Mendes
Persistência de dados e padrão DAO Padrões de Projeto Orientado a Objetos Profa. Danielle Martin/Mauricio Universidade de Mogi das Cruzes.
Atividade ASP.NET Portal da Memoria Atividade Desenvolver uma aplicação ASP.NET com funcionalidade similar à existente no site centenário.ifrn.edu.br utilizando.
Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos
Acesso a Banco de dados com JDBC
Transcrição da apresentação:

Capítulo 11 JDBC

Java Data Base Conectivity Introdução Pacote java.sql Abrindo e fechando conexões Operações na base de dados Operações parametrizadas Transações Consultas Stored procedures Design patterns DAO e VO Projeto Final

Introdução Arquitetura Cliente/Servidor Cliente Servidor Oracle MS SQL Server MySql

Introdução JDBC O JDBC (Java Data Base Conectivity) é uma especificação elaborada pela antiga Sun para prover a acessibilidade de aplicações Java com bancos de dados. Trata-se de um padrão de acesso a dados obedecido pela indústria de bancos de dados. A fim de seguir este padrão, os fabricantes devem distribuir drivers JDBC aos desenvolvedores Java.

Introdução Tipos de driver APLICAÇÃO JAVA DRIVER TIPO 1 CONFIG. ODBC COMPONENTE “CLIENT” MIDDLEWARE BANCO DE DADOS BANCO DE DADOS BANCO DE DADOS BANCO DE DADOS

Introdução Tipos de driver Tipo 1 Driver JDBC que usa a ponte de comunicação ODBC-JDBC para acessar a base pelo antigo padrão ODBC criado pela Microsoft. O ODBC trata-se de um antigo padrão de acessibilidade desenvolvido pela Microsoft que ainda pode ser utilizado no acesso a fontes de dados legadas tais como Fox Pro, DBase, Clipper, Access, etc.

Introdução Tipos de driver Tipo 2 Um driver se enquadra no tipo 2 quando necessita de algum software complementar instalado na estação de trabalho (máquina cliente) para acessar a base de dados. Utilizam API’s auxiliares e requerem a instalação de algum componente adicional nativo ao Sistema Operacional.

Introdução Tipos de driver Tipo 3 Tipo de driver que necessita de uma API de rede via middleware geralmente instalado no próprio servidor de dados para traduzir requisições para o driver desejado. Não requer nenhum software adicional no cliente além do driver JDBC.

Introdução Tipos de driver Tipo 4 Driver que se comunica diretamente com o banco de dados usando puramente soquetes de rede. É desenvolvido pelo fabricante totalmente em Java. Não requer código adicional do lado do cliente nem no servidor. É simples de usar e possui melhor performance que os demais tipos.

Introdução Alguns drivers Microsoft SQL Server JDBC Driver sqljdbc4.jar MySql Connector / J mysql-connector-java-5.1.20-bin.jar Oracle JDBC ojdbc6.jar (antigo classes12.jar)

Pacote java.sql Contém classes utilizadas no acesso e manipulação de dados externos via JDBC.

Pacote java.sql 0..1 0..1 0..* DriverManager Statement Connection PreparedStatement ResultSet 0..1 SQLException CallableStatement 0..*

Abrindo e fechando conexões Carregamento do driver Antes de solicitar uma conexão com a base de dados, devemos primeiramente realizar o carregamento do driver para a memória através do comando: Class.forName(“com.mysql.jdbc.Driver”) O comando Class.forName(“...”) realiza o carregamento de alguma classe para a memória sem criar instâncias.

Abrindo e fechando conexões Carregamento do driver O método forName() requer o tratamento da exception ClassNotFoundException que pode ocorrer na aplicação caso o driver não esteja no classpath: try { Class.forName(“com.mysql.jdbc.Driver”); } catch (ClassNotFoundException e) { System.out.println(“Não foi possível carregar o driver.”); }

Abrindo e fechando conexões Abrindo a conexão com a base de dados. A interface java.sql.Connection representa uma conexão com a base de dados e é o ponto de partida para realizarmos qualquer tipo de operação com esta. Podemos obtem uma Connection (abrir uma conexão) utilizando a classe java.sql.DriverManager: Connection cn = DriverManager.getConnection( “jdbc:mysql://sigma.server.com.br:3306/dbtest”, “usuario”, “senha”);

Abrindo e fechando conexões Abrindo a conexão com a base de dados. DriverManager.getConnection( “jdbc:mysql://sigma.server.com.br:3306/dbtest”, “usuario”, “senha”); URL de conexão (Caminho/endereço do servidor) Usuário Senha

Abrindo e fechando conexões URL de conexão A URL de conexão define o caminho do servidor de dados e é específico para cada driver utilizado: jdbc:mysql://servidor:3306/database jdbc:sqlserver://servidor\instancia:1433;databaseName=database jdbc:oracle:thin:@servidor:1521:instancia

Abrindo e fechando conexões Fechando a conexão Após encerrarmos todas as operações com a base de dados devemos fechar a conexão utilizada: cn.close(); Conexão utilizada no acesso à base de dados

Abrindo e fechando conexões Fechando a conexão Tanto a abertura quanto o fechamento da conexão requerem o tratamento da exceção SQLException: try { Class.forName(“com.mysql.jdbc.Driver”); Connection cn = DriverManager.getConnection( “jdbc:mysql://server:3306/db”, “usuario”, “senha”); /* ... operações com a base de dados ... */ cn.close(); } catch (ClassNotFoundException e) { System.out.println(“Não foi possível carregar o driver.”); } catch (SQLException e) { System.out.println(“Falha ao conectar à base de dados.”); }

Operações na base de dados Com a conexão aberta podemos realizar operações na base de dados, como inclusão, exclusão, alteração e outros. Cada operação na base de dados é definida por uma instrução na linguagem SQL, chamada de “statement”: UPDATE tab_funcionario SET salario = 5000 WHERE matr = 34 INSERT INTO tab_setor (codigo, nome) VALUES (34, ‘RH’) DELETE FROM tab_produto WHERE codigo = 4983

Operações na base de dados Interfaces statements: Statement PreparedStatement CallableStatement

Operações na base de dados Interfaces statements: Statement Utilizado para executar instruções SQL simples e pré-definidas. PreparedStatement Utilizado para executar instruções SQL parametrizadas. CallableStatement Utilizado para executar stored procedures e functions

Operações na base de dados A interface Statement Utilizado para execução de simples instruções SQL Statement st = cn.createStatement(); st.executeUpdate(“UPDATE tab_func SET salario = salario + 200”); st.executeUpdate(“DELETE FROM tab_func”); st.executeUpdate(“INSERT INTO tab_cargo (nome) VALUES (‘RH’)”); st.executeUpdate(“CREATE TABLE tab_produto (...)”); st.close(); Conexão utilizada no acesso à base de dados

Operações parametrizadas A interface PreparedStatement Principal tipo de statement utilizado no acesso e manipulação de dados da base Representa alguma instrução SQL parametrizada, onde alguns de seus valores são dinamicamente assinalados pela aplicação A principal vantagem do PreparedStatement é que sua instrução pode ser executada diversas vezes, cada hora com valores diferentes.

Operações parametrizadas A interface PreparedStatement Exemplo 1 PreparedStatement ps = cn.prepareStatement( “INSERT INTO tab_func (matricula, nome, salario) VALUES (?, ?, ?)”); ps.setInt(1, 1001); ps.setString(2, “José Souza”); ps.setDouble(3, 3200.45); ps.executeUpdate(); ps.close(); Conexão utilizada no acesso à base de dados 1 2 3

Operações parametrizadas A interface PreparedStatement Exemplo 2 PreparedStatement ps = cn.prepareStatement( “UPDATE tab_func SET salario = ? WHERE matricula = ?”); ps.setDouble(1, 3200.45); ps.setInt(2, 1001); ps.executeUpdate(); ps.setDouble(1, 7350.92); ps.setInt(2, 1005); ps.close(); Conexão utilizada no acesso à base de dados 1 2

Operações parametrizadas A interface PreparedStatement Ao criar um PreparedStatement devemos especificar a declaração SQL que será executada contendo caracteres de interrogação ?. Cada interrogação contida na declaração SQL representa um parâmetro – um valor a ser assinalado dinamicamente na aplicação. Um PreparedStatement deve ter todos os seus valores assinalados antes de ser executado.

Operações parametrizadas Tipos de parâmetros Tipo SQL Método set Tipo Java CHAR, VARCHAR setString() java.lang.String INT, DECIMAL, NUMERIC (sem parte fracionária) setInt() int DOUBLE, DECIMAL, NUMERIC (podendo haver parte fracionária) setDouble() double BOOLEAN setBoolean() boolean DATE setDate() java.sql.Date TIME setTime() java.sql.Time DATETIME, TIMESTAMP setTimestamp() java.sql.Timestamp BLOB, MEDIUMBLOB, LONGBLOB setBinaryStream() java.io.InputStream NULL setNull()

Operações parametrizadas Método setString() Assinala um parâmetro do tipo texto. ps = cn.prepareStatement( “DELETE FROM tab_func WHERE cargo LIKE ?”); ps.setString(1, “Manuel”); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setInt() Assinala um parâmetro numérico sem parte fracionária. ps = cn.prepareStatement( “DELETE FROM tab_func WHERE matricula = ?”); ps.setInt(1, 7012); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setDouble() Assinala um parâmetro numérico podendo possuir parte fracionária. ps = cn.prepareStatement( “UPDATE tab_func SET salario = ?”); ps.setInt(1, 2500.35); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setBoolean() Assinala um parâmetro booleano e armazena na base como 0 (false) ou 1 (true) ps = cn.prepareStatement(“UPDATE tab_func SET ativo = ?”); ps.setBoolean(1, true); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setDate() Assinala um parâmetro do tipo java.sql.Date, que representa uma data (dia, mês e ano) ps = cn.prepareStatement(“UPDATE tab_func SET nasc = ?”); Calendar calendar = Calendar.getInstance(); Calendar.set(1992, 0, 25); /* dia 25/01/1992 */ java.sql.Date date = new java.sql.Date(calendar.getTimeInMillis()); ps.setDate(1, date); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setTime() Assinala um parâmetro do tipo java.sql.Time, que representa um horário (hora, minuto e segundo) ps = cn.prepareStatement(“UPDATE tab_func SET hr_entr = ?”); Calendar calendar = Calendar.getInstance(); Calendar.set(0, 0, 0, 12, 15, 30); /* 12:15:30 */ java.sql.Time time = new java.sql.Time(calendar.getTimeInMillis()); ps.setTime(1, time); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setTimestamp() Assinala um parâmetro do tipo java.sql.Timestamp, que representa um instante no tempo (ano, mês, dia, hora, minuto e segundo) ps = cn.prepareStatement(“UPDATE tab_func SET nasc = ?”); Calendar calendar = Calendar.getInstance(); Calendar.set(1992, 0, 25, 12, 15, 30); /* 25/01/1992 12:15:30 */ Timestamp dateTime = new Timestamp(calendar.getTimeInMillis()); ps.setTimestamp(1, dateTime); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setBinaryStream() Assinala um parâmetro do tipo java.io.InputStream, que representa alguma informação binária, como uma foto, mp3, doc ou outro. ps = cn.prepareStatement(“INSERT INTO tab_foto (foto) VALUES (?)”); ps.setBinaryStream(1, new FileInputStream(“C:\\image\\foto.jpg”)); ps.executeUpdate(); ps.close();

Operações parametrizadas Método setNull() Assinala um parâmetro com o valor NULL ps = cn.prepareStatement( “INSERT INTO tab_func (nome, salario) VALUES (?, ?)”); ps.setString(1, “Manuel silva”); ps.setNull(2); ps.executeUpdate(); ps.close();

INSERT INTO tab_role (role_name) VALUES (?) Exercício Crie uma aplicação para cadastrar cargos na tabela tab_role. A aplicação deverá solicitar que o usuário digite nomes de cargos em prompt de comando (utilize a classe Scanner). Para cada cargo digitado abra a conexão com a base de dados e execute o comando abaixo passando como parâmetro o cargo digitado pelo usuário: INSERT INTO tab_role (role_name) VALUES (?)

Transações Chamamos de transação a um conjunto de operações realizadas na base de dados que podem ser desfeitas em situações de falha ou outro problema. Quando corretamente utilizada, uma transação garante a integridade dos dados contidos na base. Chamamos de rollback ao comando utilizado para desfazer as operações retidas pela transação e commit ao comando utilizado para efetivá-las na base de dados.

Transações O JDBC permite a criação de aplicações Java que manipulam transações com bancos de dados que oferecem suporte a este tipo de recurso. Para isto contamos com os seguintes métodos da interface java.sql.Connection: setAutoCommit(boolean) commit() rollback()

Transações Exemplo cn = DriverManager.getConnection(...); st = cn.createStatement(); try { cn.setAutoCommit(false); st.executeUpdate(“INSERT INTO tab (...) VALUES (...)”); st.executeUpdate(“DELETE FROM tab WHERE ...”); st.executeUpdate(“UPDATE tab SET ....”); cn.commit(); } catch (Exception e) { cn.rollback(); }

Consultas As consultas na base de dados são realizadas mediante o comando SELECT. Através dele podemos obter os dados contidos em uma ou mais tabelas seguindo critérios, agrupamentos e/ou ordenações conforme necessidade da aplicação. Para capturarmos os dados provenientes do comando SELECT, o JDBC conta com a interface java.sql.ResultSet

Consultas O ResultSet Um ResultSet representa um cursor proveniente da base de dados. Trata-se de um conjunto de dados em memória de forma tabular que possui um ponteiro apontando para uma de suas linhas, a qual é chamada de registro atual.

Algum Statement ou PreparedStatement Consultas Algum Statement ou PreparedStatement ResultSet rs = st.executeQuery(“SELECT * FROM tab_func”); rs.next(); codigo = rs.getInt(“f_code”); nome = rs.getString(“f_name”); salario = rs.getDouble(“f_rmnt”); ... f_code f_name f_rmnt 1003 Manuel 1.253,86 1004 Joaquim 950,60 1008 Maria 1.530,15 1012 Henrique 6.530,45 1039 João 4.350,12 1112 Priscila 843,00 1128 Ricardo 7.815,26

Consultas ResultSet rs = st.executeQuery(“SELECT * FROM tab_func”); while (rs.next()) { codigo = rs.getInt(“f_code”); nome = rs.getString(“f_name”); salario = rs.getDouble(“f_rmnt”); ... } rs.close(); f_code f_name f_rmnt 1003 Manuel 1.253,86 1004 Joaquim 950,60 1008 Maria 1.530,15 1012 Henrique 6.530,45 1039 João 4.350,12 1112 Priscila 843,00 1128 Ricardo 7.815,26

Consultas Outro exemplo PreparedStatement ps = cn.prepareStatement( “SELECT f_name, f_rmnt FROM tab_func WHERE salario > ?”); ps.setDouble(1, 1000); ResultSet rs = ps.executeQuery(); while (rs.next()) { nome = rs.getString(“f_name”); salario = rs.getDouble(“f_rmnt”); ... } rs.close();

Exercício Crie uma aplicação que solicite ao usuário que digite um nome ou o pedaço de um nome. Realize uma busca na tabela de funcionários exibindo na tela o nome e salário de todos os usuários que possuam o pedaço de nome digitado. Utilize a consulta abaixo para obter os dados da base: SELECT func_name, func_rmnt FROM tab_func WHERE func_name LIKE ?

Stored procedures Chamamos de Stored Procedure a um conjunto de instruções SQL que juntas formam um pequeno programa armazenado e executado no banco de dados. Alguns bancos de dados como MS SQL, Oracle, MySQL, Postgree e outros permitem este tipo de recurso. O uso de Stored Procedures pode reduzir o tráfego na rede, melhorar a performance ou criar mecanismos de segurança ao realizar alguma operação na base de dados.

Stored procedures As Stored Procedures são semelhantes a métodos Java. Podem possuir parâmetros e valores de retorno. CREATE PROCEDURE prc_calcula_juros( IN p_valor_inicial DECIMAL(10,2), IN p_taxa DOUBLE, IN p_prazo INTEGER, OUT p_valor_final DECIMAL(10,2)) BEGIN ... ... END;

Stored procedures A interface CallableStatement No JDBC podemos solicitar a execução de uma Stored Procedure através da interface java.sql.CallableStatement CallableStatement cs = cn.prepareCall(“{ call prc_calcula_juros(?, ?, ?, ?) }”); cs.setDouble(1, 100.0); cs.setDouble(2, 0.1); cs.setInt(3, 2); cs.registerOutParameter(4, Types.DOUBLE); cs.executeUpdate(); double result = cs.getDouble(4);

Conexão utilizada no acesso à base de dados Stored procedures A interface CallableStatement Para obter uma instância de CallableStatement utilizamos o método prepareCall() sobre a conexão com a base. Devemos neste momento informar o String de execução da Stored Procedure desejada: CallableStatement cs = cn.prepareCall(“{ call prc_calcula_juros(?, ?, ?, ?) }”); Conexão utilizada no acesso à base de dados Nome da procedure Parâmetros

Stored procedures A interface CallableStatement Os parâmetros de entrada (IN) devem ser todos preenchidos conforme seu tipo, inserindo os valores desejados: cs.setDouble(1, 100.0); /* Parâmetro 1 */ cs.setDouble(2, 0.1); /* Parâmetro 2 */ cs.setInt(3, 2); /* Parâmetro 3 */

cs.registerOutParameter(4, Types.DOUBLE); /* Parâmetro 4 */ Stored procedures A interface CallableStatement Os parâmetros de saída (OUT) devem ser todos registrados conforme seu tipo, informando ao JDBC que estes são valores que serão retornados pela procedure. Para informar o tipo de retorno, utilize uma das constantes da classe java.sql.Types: cs.registerOutParameter(4, Types.DOUBLE); /* Parâmetro 4 */

Número do parâmetro de saída Stored procedures A interface CallableStatement Após preenchidos e/ou registrados todos os parâmetros, podemos executar a procedure com o método executeUpdate() Após executada a procedure, podemos recolher os valores de retorno provenientes dos parâmetros de saída cs.executeUpdate(); double result = cs.getDouble(4); Número do parâmetro de saída

Exercício (parte 1) A procedure prc_numero_descricao foi criada em MySql para fornecer a descrição por extenso de um número inteiro especificado. Para tal, esta procedure possui dois parâmetros: Parâmetro 1: Nome: p_numero Tipo: INTEGER I/O: IN (entrada) CREATE PROCEDURE prc_numero_descricao( IN p_numero INTEGER, OUT p_descricao VARCHAR(100)) Parâmetro 2: Nome: p_descricao Tipo: VARCHAR(100) I/O: OUT (saída)

Exercício (fim) Crie uma aplicação Java que solicite que o usuário digite um número inteiro. Execute a procedure prc_numero_descricao passando o número inteiro digitado pelo usuário. Resgate o valor de retorno (parâmetro 2) da procedure e exiba-o na tela.

Design pattern DAO/VO

Projeto Final