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 Universidade Federal de Campina Grande Disciplina: Banco de Dados I Professor:

Apresentações semelhantes


Apresentação em tema: "SQLJ: uma alternativa de alto nível a JDBC Universidade Federal de Campina Grande Disciplina: Banco de Dados I Professor:"— 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{ }; 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 1.1.x (method block)*/ }

9 Exemplo:

10 Sintaxe Inicial: Declarações (3 de 3) Existem 2 tipos de declarações SQLJ: –Iterator –Context Iterator –Declarações que definem classes iterator –Usado para receber os resultados de consultas Context –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

13 Sintaxe Inicial: Iterator (2 de 8) named iterators positional iterators

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

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); #sql { SQL operation };

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) {... }...

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 context context_classname implements intfc1,..., intfcN; Exemplo: #sql iterator EmpIter implements mypackage.EmpIterIntfc (String emame, int empno, float sal);

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) Sintaxe: –: [mode] variavel_host –Onde mode pode ser OUTIN, 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 }

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()

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

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 –http://www.oracle.com/technology/documentation/in dex.htmlhttp://www.oracle.com/technology/documentation/in dex.html Tutoriais na Web: –http://www.onjava.com/pub/ct/46http://www.onjava.com/pub/ct/46 –http://www.javaworld.com/javaworld/jw /jw-05-sqlj_p.htmlhttp://www.javaworld.com/javaworld/jw /jw-05-sqlj_p.html –http://www.javaolympus.com/J2SE/Database/SQLJ/ SQLJ.jsphttp://www.javaolympus.com/J2SE/Database/SQLJ/ SQLJ.jsp Leitura recomendada: Java Programming with Oracle SQLJ, Jason Price, OReilly


Carregar ppt "SQLJ: uma alternativa de alto nível a JDBC Universidade Federal de Campina Grande Disciplina: Banco de Dados I Professor:"

Apresentações semelhantes


Anúncios Google