Fazer o Forms abrir um novo Form ao perder conexão !

agosto 3rd, 2009 por Felipe Ribeiro Santos

Saudações Rubro-Negras a todos, ( MENGÃO )

Depois de longas 3 semanas de prova na faculdade, estou vivo !! Agora é só relaxar e planejar o que fazer nos horários vagos que tenho enquanto a faculdade não volta… Aproveitar pra repor as noites de sono perdidas, atenção para namorada, família, cachorro e o BLOG!!!

Enfim, andei dando uma pesquisada e achei algo implementado e muito interessante !

Digamos que você tenha um software responsável pelo controle de créditos telefônicos em um banco separado da sua aplicação principal.

O cliente paga um valor, esse valor é creditado e através de um usuário e senha você consegue usar ligar normalmente até acabar os créditos.

Com isso, no meu sistema principal, preciso ter a informação do quanto de crédito já foi utilizado ou algo parecido, então, a cada ligação, faço o débito da conta do cliente.

Como não tenho uma integração direta entre as aplicações, vou precisar de um Robô que faça a leitura de um lado e jogue no outro, porém, por algum motivo, esse robô perdeu a conexão e ninguém foi avisado, então, teremos que ficar nos preocupando vendo se o robô está sempre ativo, etc…

Vamos lá!

Preciso criar 3 parâmetros para receber os valores de usuário, senha, banco. Depois de criado e alimentado esses parâmetros (se é um robô, usuário e senha ficam fixados nesses parâmetros. caso desejem, podem passar esses valores por linha de comando como vou mostrar mais pra frente).
Preciso então criar uma trigger WHEN-NEW-FORM-INSTANCE e então atribuir esses valores ao seu bloco de login.

http://pastebin.com/f53b294ce

Próximo passo é implementar a trigger ON-LOGON.

No próximo passo vamos implementar a trigger que irá nos ajudar a identificar os tipos de erro, é a ON-ERROR.
Todo erro existente no forms, passa por ela para que seja possível um tratamento… se não tem nada ali, o erro aparece normalmente…

Agora que tudo foi criado e tratado, resta apenas a rotina final e mais importante… que é fazer a rotina para quando o timer disparar, fazer a abertura do novo form por linha de comando…

então, na trigger WHEN-TIMER-EXPIRED, vamos ter o seguinte código.

http://pastebin.com/f3500ff12

Pronto, Dessa forma, não preciso me preocupar tanto com a rotina do robô responsável pela integração… se a conexão parar, ele mesmo identifica isso, abre novo form e tudo resolvido! )

Essa solução ajuda para aqueles casos em que sua empresa trabalha em RAC, pois, se uma instância cair, automaticamente ele fecha a que deu erro e abre outra na instância que ficou ativa.

PL/SQL BULK BINDS

julho 2nd, 2009 por Felipe Ribeiro Santos

Bem, pensando sempre no ganho de performace é interessante falar de bunk binds.

Então, a associação de valores a variáveis de pl/sql em comandos de sql é chamado de bind. A associação de uma coleção inteira de uma única vez é chamado de bulk bind.

http://pastebin.com/f18f2fae8

No exemplo acima o comando Delete é executado 2000 vezes, isto significa que o pl/sql ( Engine ) envia um comando SQL Delete para cada valor da lista.

Cada vez que a pl/sql engine tem necessidade de estabelecer um interrupçao para acionar a SQL Engine, ocorre um overhead.

Sendo assim quando trabalhamos com coleções ( Nested Tables, Index-By, Varray e Host Arrays ) e utilizamos interações ( loops ) usando elementos destas coleções como variáveis Bind ( em comandos SQL), adicionamos um overhead a nossa execução.

Se a interação afetar 5 ou mais linhas do banco de dados, o uso de Bulk Binds pode aumentar a perfomace cosideravelmente.

No link abaixo tempos o mesmo trecho de programa em que substituimos o comando FOR pelo comando ForAll.

http://pastebin.com/f6e1b98aa

No exemplo a coleção Wcd_L é passada inteira de uma única vez para SQL Engine.

O comando ForAll

Este comando indica à PL/SQL Engine para preparar toda a coleção de entrada ( Bulk Bind ) antes de enviá-la à SQL Engine. A sintaxe é apresentada a seguir.

http://pastebin.com/f64a31f5e

Caracteristica / Restrições

O comando SQL presente na sintaxe pode ser Insert, Update ou Delete fazendo referência a elementos da coleção ( a SQL Engine executa um comando Select para cada índice no intervalo )

As fronteiras (<valor inferior> e <valor superior>) devem especificar um intervalo válido de índices numéricos consecutivos ( não precisa ser a coleção inteira, pode ser parte da coleção desde que seja consecutiva).

Todos os elementos da coleção no intervalo especificado devem existir.

O subscrito da coleção não pode ser uma expressão, portanto o texto Where CAMPO = wcd_lista(i+1) é inválido.

Antes de cada comando SQL executado pelo ForAll é criado um SavePoint implícito. Desta forma se no comando ForAll de um determinado programa, a terceira execução( ou utilização do terceiro índice da lista) falha, a primeira e segunda execuções do comando SQL associado não são desmanchadas, apenas a partir do terceiro índice a ação falha.

Leio o resto desta entrada »

PL/SQL, O início !

julho 1st, 2009 por Felipe Ribeiro Santos

Bem, a PL/SQL é uma linguagem de programação procedural da ORACLE, extensão ao SQL DML.

Com o PL/SQL pode-se usar comandos SQL para manipular os dados da base de dados ORACLE e fluxos de controle para processamento de dados.

Podemos declarar variáveis, criar subprogramas ( procedures e functions ) e controlar erros de execução.

A linguagem possui uma estrutura baseada em blocos. E cada bloco podem ter sub-blocos. Um bloco permite que se façam declarações locais aos bloco, que deixam de existir quando o bloco termina.

Cada bloco é composto de básicamente 3 áreas.

http://pastebin.com/f65bc5ee9

A ordem das partes é Lógica, primeiro devemos efetuar as declarações, para depois utilizar (na lógica) as variáveis criadas. A situações de erros detectadas a tempo de execução podem ser tratadas na parte referente a erros.

A indicação de fim de linha de comando, em PL/SQL, é feita com um ponto e virgula. (   ; )

Exemplos:

http://pastebin.com/f79fa0bc

http://pastebin.com/f75b25585

Componentes da Linguagem

Identificadores

Um identificador em PL/SQL consiste de uma letra opcionalmente seguida de números, $, _ ou #. As letras podem ser minúsculas ou maiúsculas ( NÃO É CASE SENSITIVE ).

http://pastebin.com/f24bd07af

O tamanho máximo de um identificador é 30 caracteres.

Existem algumas palavras que possuem um significado especial para a PL/SQL e não devem ser usados como identificadores, essas são chamadas de palavras reservadas.

Literais

É uma representação explícita de um número, caracter ( string de comprimento 1), string ( conjunto de caracteres) ou boleano, não representado por um identificador.

http://pastebin.com/f4e81e4a3

Variáveis

Cada constante ou variável possui um tipo que especifica o formato de armazenamento, restrições e intervalo de valores. O dado pode ser simples ou composto.

Sintaxe

Variável - tipo [not null] [ { := default } Valor inicial ]

Subtipos

São subconjuntos de tipos de variáveis. Possuem um restrição sobre o tipo que caracteriza o subconjunto de valores.

Tipo de Variáveis

BINARY_INTEGER;

CHAR

NUMBER;

LONG;

VARCHAR2;

RAW;

BOOLEAN;

PLS_INTEGER;

%TYPE;

Leio o resto desta entrada »

dbms_output.put_line(’Hello World !’);

julho 1st, 2009 por Felipe Ribeiro Santos

Inicialmente, gostaria de agradecer aos moderadores pelo incentivo a criação deste blog e o modo como toda essa gama de informação ORACLE tem chegado até nós. Temos muito a agradecer por este grande canal de informação. ( puxa-saco !! )

Enfim, Tentarei tratar da maneira mais simples o possível sobre assuntos que rodeia a todos que trabalham na plataforma ORACLE. E que até hoje, a cada desenvolvimento que executo, aprendo uma coisa diferente. ( E agora, a cada post também !! : D )

Abordarei assuntos sobre programação em pl/sql e uma breve introdução SQL. Estudaremos alguns caso de testes de desempenho e otimização de alguns algoritmos.

Espero que vocês gostem e que façam um bom aproveito do conteúdo postado.

E não esqueçam de comentar !