A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

SQLJ: uma alternativa de alto nível a JDBC

Apresentações semelhantes


Apresentação em tema: "SQLJ: uma alternativa de alto nível a JDBC"— Transcrição da apresentação:

1 SQLJ: uma alternativa de alto nível a JDBC
Universidade Federal de Campina Grande Disciplina: Banco de Dados I Professor: Cláudio de Souza Baptista Estagiário: Elvis Rodrigues da Silva

2 Roteiro Introdução Sintaxe Inicial Comandos avançados Requisitos
Referências

3 Introdução (1 de 5) SQLJ é uma tecnologia que permite a um programa Java acessar um banco de dados utilizando statements SQL embutidos Arquivo fonte termina com “.sqlj” Manipulações SQLJ Meta informações: Create, Alter, Drop Dados: Select, Insert, Update, Open, Fetch Controle de Transações: Commit, Rollback

4 Introdução (2 de 5) SQLJ não pode ser compilado diretamente pelo compilador Java Solução: usar um tradutor SQLJ Translator

5 Introdução (3 de 5) O tradutor verifica erros de sintaxe e semânticos na instrução SQL em tempo de tradução: Nomes incorretos Checagem de tipos Verifica se o comando SQL está de acordo com o Banco de Dados Etc.

6 Introdução (4 de 5) A IDE Oracle JDeveloper reconhece a sintaxe de SQLJ para o banco de dados Oracle, mas é possível utilizar outros compiladores O IBM Websphere também possui compatibilidade com SQLJ para o banco de dados IBM DB2

7 Introdução (5 de 5) Vantagens de SQLJ sobre JDBC (comandos estáticos)
Código-fonte reduzido Checagem de tipos SQL via conexão Associação de variáveis em um único comando Checagem de tipos de parâmetros e retorno antes da execução Desvantagens Um passo a mais no processamento: tradução de sqlj para java

8 Sintaxe Inicial: Declarações (1 de 3)
Declarações SQLJ : #sql{<comando SQL>}; Regras pra declarações SQLJ SQLJ declaration; // OK (top level scope) class Outer { SQLJ declaration; // OK (class level scope) class Inner { SQLJ declaration; // OK (nested class scope) } void func() { SQLJ declaration; /* OK in JDK 1.2.x; ILLEGAL in JDK x (method block)*/

9 Exemplo:

10 Sintaxe Inicial: Declarações (3 de 3)
Existem 2 tipos de declarações SQLJ: Iterator Context Declarações que definem classes iterator Usado para receber os resultados de consultas Usado para criar uma conexão ao Banco de Dados

11 Sintaxe Inicial: SQLJ Namespace
Todas as restrições de nome em Java são aplicadas aqui Evitar usar as palavras reservadas, nome de classes e colunas em iterator: iterator context with

12 Sintaxe Inicial: Iterator (1 de 8)
Declaração: Modifiers: publics, static, etc Existem 2 tipos de iterator: named iterators positional iterators - Os modificadores são separados por vírgula;

13 Sintaxe Inicial: Iterator (2 de 8)
named iterators positional iterators Named iterators: você especifica nome e tipo Positional iterators: você especifica somente os tipos Uma classe é criada com o nome EmpIter contendo dois atributos ename e sal;

14 Sintaxe Inicial: Iterator (3 de 8)
Exemplo named iterators: #sql iterator MyCheckedIter (String ename, double sal); ... MyCheckedIter iter; #sql iter = { SELECT ename, sal FROM Employee}; while (iter.next()) { System.out.println(iter.ename()); System.out.println(iter.sal()); }

15 Sintaxe Inicial: Iterator (4 de 8)
Obtendo os elementos de um Positional iterators FETCH INTO seguido por endFetch() O FETCH INTO chama implicitamente o método next()

16 Exemplo de “positional iterators”

17 Sintaxe Inicial: Iterator (6 de 8)
Iterator e ResultSet podem existir dentro de outro Iterator em Oracle SQLJ Exemplos: CREATE TABLE DEPT ( DEPTNO NUMBER(2), DNAME VARCHAR2(14) ); CREATE TABLE EMP ( EMPNO NUMBER(4), ENAME VARCHAR2(10), SAL NUMBER(7,2), DEPTNO NUMBER(2)

18 Sintaxe Inicial: Iterator (7 de 8)

19 Sintaxe Inicial: Iterator (8 de 8)
Outro exemplo: Declaração: Execução:

20 Sintaxe Inicial: Connection (1 de 7)
Existem várias formas de criar uma conexão com o Banco de Dados: Criando um contexto Default DefaultContext defctx = new DefaultContext "scott", "tiger", false); Através da declaração SQLJ:

21 Sintaxe Inicial: Connection (2 de 7)
Exemplo: #sql context MyContext; ... MyContext myContext = new “scott", "tiger ", false);

22 Sintaxe Inicial: Connection (3 de 7)
Simples conexão usando connect() da classe oracle.sqlj.runtime.Oracle Oracle.connect(MyClass.class, "connect.properties"); orcl", "scott", "tiger"); A função connect() simplifica o processo de criação e usa uma instância da classe DefaultContext In this example, the connection will use the JDBC Thin driver to connect user scott (password tiger) to a database on the machine localhost through port 1521, where orcl is the SID (Oracle session ID) of the database to connect to on that machine. Oracle SQLJ provides the oracle.sqlj.runtime.Oracle class to simplify the process of creating and using instances of the DefaultContext class. A classe oracle.sqlj.runtime.Oracle é responsável por estabelecer conexão ao Banco de Dados

23 Sintaxe Inicial: Connection (4 de 7)
Formato do arquivo “properties”: sqlj.user=scott sqlj.password=tiger

24 Sintaxe Inicial: Connection (5 de 7)
Multiplas conexões DefaultContext ctx1 = Oracle.getConnection ( "scott", "tiger"); DefaultContext ctx2 = Oracle.getConnection ( "bill", "lion"); #sql [ctx1] { SQL operation }; ... #sql [ctx2] { SQL operation };

25 Sintaxe Inicial: Connection (6 de 7)
Se uma conexão é usada várias vezes podemos fazer: DefaultContext.setDefaultContext(ctx1); #sql { SQL operation }; ... DefaultContext.setDefaultContext(ctx2);

26 Sintaxe Inicial: Connection (7 de 7)
Fechando a conexão Há um “commit” implícito quando a conexão é fechada ... finally { try { ctx.close(); //ou Oracle.close(); } catch(SQLException ex) { } For Oracle, there is an implicit COMMIT when a connection is closed, and an implicit ROLLBACK when a connection is garbage-collected without being closed, but it is not advisable to rely on these mechanisms.

27 Sintaxe Inicial: Interfaces (1 de 3)
Iterator e Context são transformados em classes java depois de traduzidos #sql iterator MyCheckedIter (String ITEM_NAME, Double COST); class MyCheckedIter extends sqlj.runtime.ref.ResultSetIterImpl implements sqlj.runtime.NamedIterator{ public String ITEM_NAME(){…} public Double COST(){…} } tradutor

28 Sintaxe Inicial: Interfaces (2 de 3)
Quando se declara um “iterator” ou “context”, pode-se especificar uma ou mais interfaces #sql <modifiers> context context_classname implements intfc1,..., intfcN; Exemplo: #sql iterator EmpIter implements mypackage.EmpIterIntfc (String emame, int empno, float sal); Clausula “implements” é mais útil na declaração “iterator” When you declare any iterator class or connection context class, you can specify one or more interfaces to be implemented by the generated class.

29 Exemplo: evitar acesso a uma coluna da tabela
Erro de compilação

30 Sintaxe Inicial: SubClasses
Exemplo: // Declarando um iterator #sql public static iterator EmpIter(int empno, String ename); ... //criando a subclasse public static class EmpColl extends EmpIter {...} //usando a subclasse EmpColl ec; #sql ec = { select ename, empno from emp };

31 Sintaxe Inicial: Hosts (1 de 4)
Usados para troca de valores entre variáveis Java e SQLJ Podem ser referenciados dentro de uma instrução SQLJ SQLJ fica responsável em devolver os valores O tipo da variável host é convertida para o tipo compatível com a coluna

32 Sintaxe Inicial: Hosts (2 de 4)
: [mode] variavel_host Onde mode pode ser IN, OUT e INOUT O default é OUT se a variável é parte de uma lista INTO ou em um statement SET e é IN caso contrário

33 Sintaxe Inicial: Hosts (3 de 4)
Exemplos String nome; int mat = 5; #sql { SELECT aluno INTO :nome FROM cadastro WHERE matricula = :mat } :mat é o mesmo que :IN mat

34 Sintaxe Inicial: Hosts (4 de 4)
Outro exemplo: float balance = ; float minPmtRatio = 0.05; ... #sql { UPDATE creditacct SET minPayment = :(balance * minPmtRatio) WHERE acctnum = };

35 Comandos Avançados: Scrollable Iterators (1 de 8)
Iterator tem apenas um único método para navegar: next() Scrollable Iterators permite o usuário dizer o sentido da iteração

36 Comandos Avançados: Scrollable Iterators (2 de 8)
Para um iterator tornar-se um Scrollable Iterator ele deve implementar a interface “sqlj.runtime.Scrollable” Declaração: #sql public static MyScrIter implements sqlj.runtime.Scrollable (String ename, int empno);

37 Comandos Avançados: Scrollable Iterators (3 de 8)
Scrollable Interface: setFetchDirection(int) FETCH_FORWARD (default) FETCH_REVERSE getFetchDirection() boolean isBeforeFirst() boolean isFirst() boolean isLast() boolean isAfterLast()

38 Comandos Avançados: Scrollable Iterators (4 de 8)
Métodos de navegação: boolean previous() boolean first() boolean last() boolean absolute(int) boolean relative(int) void beforeFirst() void afterLast() boolean absolute(int) — Moves the iterator object to the given row number in the result set. The first row is row 1, the second is row 2, and so on. If the given row number is negative, the iterator object moves to a row position relative to the end of the result set. For example, calling absolute(-1) positions the iterator object on the last row, absolute(-2) indicates the next-to-last row, and so on. boolean relative(int)—Moves the iterator object a relative number of rows, either positive or negative from the current position. Calling relative(0) is valid, but does not change the iterator position. void beforeFirst()—Moves the iterator object to the front of the result set, before the first row. This has no effect if the result set contains no rows. void afterLast()—Moves the iterator object to the end of the result set, after the last row. This has no effect if the result set contains no rows.

39 Comandos Avançados: Scrollable Iterators (5 de 8)
Exemplo ...

40 Comandos Avançados: Scrollable Iterators (6 de 8)
Scrollable Positional Iterators O comando: #sql { FETCH :iter INTO :x, :y, :z } É uma abreviação para: #sql { FETCH NEXT FROM :iter INTO :x, :y, :z }

41 Comandos Avançados: Scrollable Iterators (7 de 8)
O comando #sql { FETCH NEXT FROM :iter INTO :x, :y, :z } sugere um padrão para movimentos alternativos: #sql { FETCH PREVIOUS FROM :iter INTO :x, :y, :z } #sql { FETCH FIRST FROM :iter INTO :x, :y, :z } #sql { FETCH LAST FROM :iter INTO :x, :y, :z } #sql { FETCH ABSOLUTE :n FROM :iter INTO :x, :y, :z } #sql { FETCH RELATIVE :n FROM :iter INTO :x, :y, :z }

42 Comandos Avançados: Scrollable Iterators (8 de 8)
Não podemos usar constantes numéricas para especificar movimentos: #sql { FETCH RELATIVE 0 FROM :iter INTO :x, :y, :z }; (ERRADO) #sql { FETCH RELATIVE :(0) FROM :iter INTO :x, :y, :z }; (OK)

43 Comandos Avançados: Constantes (1 de 2)
Declaração com constantes As constantes são sempre produzidas como “public static final” - Numa declaração com cláusula, as constantes são sempre produzidas como “public static final”

44 Comandos Avançados: Constantes (2 de 2)
Exemplo: #sql public iterator MyScrollableIterator implements sqlj.runtime.Scrollable with (sensitivity=ASENSITIVE) (String ename, int empno); Sensitivity é um atributo da interface sqlj.runtime.ResultSetIterator “with” sempre deve vir após “implements”

45 Comandos Avançados: Transação (1 de 4)
Uma transação é uma seqüência de operações SQL que o BD trata como uma simples unidade Uma transação começa depois de: conectar ao Banco de Dados depois de um COMMIT depois de um ROLLBACK

46 Comandos Avançados: Transação (2 de 4)
Commit automático Por default o auto-commit tem o valor “false” Ativando o auto-commit: Oracle.getConnection ( "scott", "tiger", true);

47 Comandos Avançados: Transação (3 de 4)
Mudando o auto-commit ctx.getConnection().setAutoCommit(false); ou ctx.getConnection().setAutoCommit(true);

48 Comandos Avançados: Transação (4 de 4)
Commit e Rollback manual #sql { COMMIT } #sql { ROLLBACK } Não usar o COMMIT ou o ROLLBACK quando o auto-commit estiver habilitado

49 Comandos Avançados: SQL Dinâmico (1 de 6)
O Oracle9i possui uma extensão para suportar SQL dinâmico em SQLJ Operações que podem mudar em tempo de execução “Meta bind” são usados para SQL dinâmico em SQLJ

50 Comandos Avançados: SQL Dinâmico (2 de 6)
Sintaxe :{ Java_bind_expression } ou :{ Java_bind_expression :: SQL_replacement_code } Identificador ou expressão Java do tipo String Seqüência de SQL tokens

51 Comandos Avançados: SQL Dinâmico (3 de 6)
Exemplo 1: ... int x = 10; int y = x + 10; int z = y + 10; String table = "new_Emp"; #sql { INSERT INTO :{table :: emp} VALUES (:x, :y, :z) }; Durante a tradução: INSERT INTO emp VALUES (10, 20, 30); Durante a execução: INSERT INTO new_Emp VALUES (10, 20, 30);

52 Comandos Avançados: SQL Dinâmico (4 de 6)
Exemplo 2: ... String table = "new_Emp"; String query = "ename LIKE ’S%’ AND sal>1000"; #sql myIter = { SELECT * FROM :{table :: emp2} WHERE :{query :: ename=’SCOTT’} }; Durante a transação: SELECT * FROM emp2 WHERE ename=’SCOTT’; Durante a execução: SELECT * FROM new_Emp WHERE ename LIKE ’S%’ AND sal>1000;

53 Comandos Avançados: SQL Dinâmico (5 de 6)
Restrições O “Meta bind” pode ser usado nos seguintes tipos de comandos: o nome de uma tabela o nome de uma coluna (sem alias) todo ou parte de uma cláusula WHERE um valor literal ou uma expressão SQL

54 Comandos Avançados: SQL Dinâmico (6 de 6)
Um “Meta bind” não pode ser a primeira expressão de uma operação SQL Não pode conter o token “INTO” Não pode aparecer em qualquer dos tipos de instruções SQL/SQLJ: CALL, VALUES, PSM SET, COMMIT, ROLLBACK, FETCH INTO ou CAST

55 Requisitos (1 de 2) Para rodar um programa SQLJ precisamos de:
Um driver JDBC Um SQLJ translator: [Oracle Home]/sqlj/lib/translator.zip (ou .jar) Um SQLJ runtime: runtime11.jar, runtime12. jar, runtime. jar, runtime-nonoracle. jar O programa [Oracle Home]/bin/sqlj

56 Requisitos (2 de 2) Procedimentos para rodar um programa SQLJ:
Colocar todos os .jar necessários no “classpath” Editar o “path” para a pasta [Oracle Home]/bin/ Criar o arquivo “.sqlj” Executar o comando: sqlj nome_arq.sqlj Executar o programa Java nome_arq

57 Referências Manuais da Oracle Tutoriais na Web:
Tutoriais na Web: Leitura recomendada: Java Programming with Oracle SQLJ, Jason Price, O’Reilly


Carregar ppt "SQLJ: uma alternativa de alto nível a JDBC"

Apresentações semelhantes


Anúncios Google