Banco de Dados - Oracle

Desvendando o Method OO4O

O Method OO4O, ou seu nome original, Oracle Objects for OLE, depois conhecido como OO4O, seria a solução criada pela empresa Oracle para acabar com todos os problemas de acesso as restrições que o banco de dados Oracle colocava sobre os outros componentes (ODBC ou OLE DB)...

por Rodrigo da Silva Almeida



Muitos programadores em geral tem uma grande dificuldade quando se trata em desenvolver aplicações voltadas ao banco de dados relacional Oracle, por ocorrer problemas de comunicação com os drivers de dados ou por falta de recurso. Para tentar resolver este problema, a Oracle resolveu criar sua própria solução.

Essa solução teria como meta, acabar com os grandes problemas dos programadores em acessar Large Objects, blocos de condições em PL\SQL e outros serviços do banco de dados, com isso acharam melhor desenvolver seu próprio driver.

Sua Origem

O Method OO4O, ou seu nome original, Oracle Objects for OLE, depois conhecido como OO4O, seria a solução criada pela empresa Oracle para acabar com todos os problemas de acesso as restrições que o banco de dados Oracle colocava sobre os outros componentes (ODBC ou OLE DB). O OO4O é um componente de automação no servidor, construído em tecnologia COM, com funções semelhante ao Microsoft ADO, onde teria como diferencial a função de otimizar a performance de acesso aos APIs, blocos PL/SQL, LOBs e MTS. Ele é totalmente voltado ao banco de dados Oracle, afim de trabalhar com as tecnologias Visual Basic, ASP, Aplicativos Office todos da Microsoft e aplicativos da linguagem C/C++.

Instalação Ao entrar no site da OTN (http://otn.oracle.com) para fazer o download do componente, deverá existir várias versões do OO4O, como utilizamos a versão DataBase Oracle 9i Release 9.2.0.1.0, então iremos fazer o download do Componente OO4O Release 9.2.0.4.0, que é uma versão compatível com o banco de dados corrente do nosso sistema operacional. Ao acabar de baixar o arquivo na máquina, apenas execute o arquivo com extensão (.exe), e espere até ele copiar todos os arquivos e concluir a instalação automaticamente.

Após o término, basta abrir seu windows explorer e procurar a pasta oo4o que está em (C:\oracle\ora92\oo4o) para confirmar a cópia do componente.

NOTA:

Para fazer o download do componente acesse o website da OTN (Oracle Tecnology Network - http://otn.oracle.com/software/tech/windows/ole/index.html) e abaixe para seu computador o arquivo. Lembrando que será necessário criar uma conta de usuário para poder realizar o download e aceitar alguns condições de uso, esse conta de usuário também é gratuita.

O Method OO4O é compactivel com quase todas as versões do sistema operacional Windows (98/2000/NT 4.0 e XP), e é recomendado deixar cerca de 30 MB livres em hard disk para os arquivos do OO4O e 128 MB RAM de memória para uma boa performance.

Características e objetos do OO4O

Um dos principais motivos que os programadores escolhem o OO4O para desenvolver seus aplicativos é a gama de serviços que ele pode oferecer para enriquecer seu aplicativo, abaixo está uma relação de serviços que está presente na versão RELEASE 9.2.0.4.0 do Method OO4O.

  • Geração de XML usando os métodos GetXML e GetXMLToFile.
  • Suporte a LOBs temporárias, onde quando chamadas as stored procedures ou funções que contém argumentos do tipo LOB (Large Objects).
  • Assistente Código OO4O, onde através dele consegue executar stored procedures em PL/SQL e JAVA.
  • Objeto de suporte para detectar conexões perdidas com o banco de dados.
  • Suporte para notificações de falhas do aplicativo.
  • Suporte a classes de biblioteca CPP e ao objeto InProcServer do Oracle.
  • Suporte a programação Dot.Net.
  • Serviços para Microsoft Transaction Server.
  • Oracle ODBC Driver.

Além de apresentar todas essas características em nível de desenvolvimento, o Method OO4O conta com 28 objetos e 148 Métodos de programação, fazendo o aplicativo ter um bom controle sobre o banco de dados.

Cada objeto tem importâncias diferentes na programação, sendo que os objetos OraSession, OraDataBase e OraDynaset são de uso indispensável no programa, pois eles são os responsáveis pela comunicação com a o banco de dados e as informações a serem utilizadas.

Fazendo uma análise sobre cada objeto, podemos entender o funcionamento de cada uma delas dentro do aplicativo e saber suas limitações de desenvolvimento caso haja possíveis erros de execução após a compilação ou execução dos programas. Abaixo está a relação dos objetos mais importantes.

OraSession – Esse é o objeto responsável pela “comunicação” entre o usuário e o banco de dados, de uso indispensável pelo programador, ele que faz a autenticação do usuário (Cliente) dentro do servidor Oracle e cria automaticamente o objeto OraConnection, permitindo o acesso a base de dados. É o primeiro objeto a ser declarado dentro do programa. Problemas com os privilégios do usuário no banco de dados podem ocasionar erros na linha de comando que ele for executado.

OraDataBase – Objeto necessário para criar o objeto OraDynaset, assim como no ADO onde precisa ter uma conexão ativa para criar os RecordSets, o Method OO4O também utilizo essa mesma filosofia de programação e deixo encarregado para o objeto OraDataBase deixar ativa a conexão com a base de dados, porque apartir da linha de comando do OraDataBase, será passado, o nome do banco de dados, usuário e senha para acesso ao banco e o tipo de método que será aplicado ao OraDynaset.

OraDynaset – Como citado acima, o objeto OraDynaset é o recordset do aplicativo, seu serviço é fazer a comunicação do aplicativo com as tabelas do banco de dados e aplicar as futuras mudanças ou consultas do sistema, como por exemplo inserir, alterar e deletar dados e utilizar outros métodos de consulta.

Após sabermos como funcionam esses essenciais objetos de programação, devemos analisar os outros que trabalham em conjunto com o aplicativo e verificar sua função dentro do aplicativo. São eles :

OraField – Seguindo a mesma linha de raciocínio do RecordSet, o OraField é onde se traz a informação do registro de uma determinada coluna da tabela do banco de dados e onde será passado o novo valor do registro.

OraConnection – Criado automaticamente quando o objeto OraSession é compilado, podendo ser mudadas algumas propriedades padrão.

OraClient – Objeto que armazena as informações do OraSession, em forma de propriedades e métodos .

OraParameter – Utilizado para passar valores em parâmetros pelo Method OO4O, muito utilizado em stored procedures.

OraParameterArray – Tem a mesma utilização que o objeto acima, porém ele tem o recurso de passar múltiplos valores por parâmetros em forma de vetor ou matriz.

OraSQLStmt – É um objeto que trabalha em conjunto com o objeto OraDataBase, pois apartir dele será executada uma instrução SQL, como por exemplo, uma instrução SELECT ou algum comando DML (Insert, Delete ou Update), equivalente ao comando ADO.Command . Após a utilização do objeto e executada a instrução SQL, o Method OO4O sempre executa um COMMIT dentro do banco de dados validando os valores da instrução. Por isso é bom sempre prestar atenção quando for utilizar um comando DML dentro do OraSQLStmt.

Os outros 19 objetos que restam para completar a lista, são de utilização adicional ao programador e sua funções são especificas para cada tipo de serviço.

OraAQ * – Esse objeto tem como finalidade iniciar o método CreateAQ, assim possibilita o envio de mensagens utilizando o banco de dados Oracle e o objeto OraAQMsg.

OraAQAgent * – Objeto que irá dizer a qual destinatário será enviada a mensagem, tem a capacidade de enviar somente uma lista de 10 Agentes por cada vez.

OraAQMsg * – Objeto responsável por enviar a mensagem até um usuário determinado.

OraAttribute – Capaz de atribuir um valor para o objeto OraRef ou OraObject.

OraBLOB e OraCLOB – Objeto especifico do Oracle para ler tabelas do tipo Large Objects, dando mais performance e agilidade na troca dos dados, porém a diversas restrições de uso e métodos a ser aplicados a eles.

OraCollection – Representa um conjunto de tipos de dados e tabelas do Oracle.

OraConnections Collection, OraFields Collection, OraParameters Collection, OraSessions Colletion, OraSubscription Collection – Contém uma lista de parâmetros de iniciação e execução dos objetos do OO4O, esses valores não podem ser alterados, adicionados e nem excluídos pelo usuário.

OraMetaData – Representa uma descrição sobre cada informação do schema do usuário dentro da banco de dados.

OraMDAttribute – Descreve cada atributo individual do schema.

OraNumber – Objeto que trabalha com operações vindas das tabelas com colunas do tipo NUMBER, onde mantém a precisão de contas e operações matemáticas. Ótimo objeto para fazer serviços que precisem de valores absolutos.

OraObject – Apresenta o valor de cada instancia do Oracle.

OraRef – Objeto que faz referencia a um outro objeto instanciado no sistema.

OraServer – Ele é o responsável em fazer a conexão física da rede com o banco de dados Oracle e seu aplicativo, é um adjunto do objeto OraDataBase.

OraSubscription – Concede visualizar os eventos do banco de dados.

( * ) Esses objetos poderão ser somente utilizados em Microsoft Visual Basic. Conseguimos compreender cada objeto do sistema e entender suas funções, falta saber os métodos que podem fazer esses objetos se tornarem mais poderosos no desenvolvimento do aplicativo.

Métodos de utilização do objeto OraDataBase

O OraDataBase tem como função criar uma espécie de Recordset do ADO para o aplicativo, no method OO4O podemos chamar de Views ou snapshots. As Views são linhas e colunas de uma determinada tabela que foram passadas através de uma instrução SQL e funciona como uma tabela virtual para o cliente. É o método de iniciação do objeto OraDynaset, podendo informar que tipo será o OraDynaset e qual será seu modo de execução dos registros. Abaixo está um exemplo de como utilizar sua sintaxe.

Existem para o OraDataBase, 8 métodos de se construir um OraDynaset, são:

NOTA:

Alguns métodos acima não poderá funcionar corretamente com algumas tecnologias e poderá ocasionar alguns erros de execução.

Trabalhando com o CreateDynaset

O método mais utilizado ao elaborar um software que tenha como base de dados o Oracle é o método CreateDynaset, devido aos seus diversos recursos facilitam a vida do programador. O método CreateDynaset pode ser chamado com uma única linha de comando onde poderá passar alguns argumentos para ter controle sobre os registros. Em comparação com o ADO, o CreateDynaset irá gerar um Dynaset que seria o mesmo que um RecordSet gerado pela ADO.

Set OraDynaset = OraDataBase.CreateDynaset (sSQL, Opção)

Ou

Set OraDynaset = OraDataBase.CreateCustomDynaset (sSQL, Opção)

sSQL = Instrução SQL passada ao banco de dados com os valores que deveram ser apresentados ao cliente.

Opção = Será o número a ser informado da opção escolhendo o modo de exibição, são 9 opções.

Desta forma o CreateDynaset oferece algumas opções de como o Dynaset será criado e seu mode de execução, abaixo tem todas as opções do Dynaset.

Entendendo todos os métodos do OO4O

Sabemos que todo o componente é composto por 148 métodos, no qual podem nos auxiliar na transição entre registros, como se fosse um ponteiro, deixando o aplicativo mais leve e melhorando a performance entre o cliente e o servidor. A tabela abaixo está mostrando todos os métodos que o programador pode utilizar no aplicativo. Lembrando que abaixo está uma tabela com o nome do método, descrição e objeto, pois existem dentro do OO4O, métodos que só podem ser aplicados a um tipo de objeto especifico do Oracle.

Os 148 métodos citados acima, estão com uma pequena descrição, apenas para saber qual é sua funcionalidade, porém mesmo assim existem restrições de utilização e mais opções dentro deles que não foram ditos. Oracle Data Control

A Oracle além de fazer um componente que atende-se os programadores web, deu um presente para os programadores que trabalham principalmente com Visual basic ou outras linguagens que aceita Active-X ou controle de dados.

O chamado Oracle Data Control é um componente Active-X desenhado para simplificar a troca de informações entre o banco de dados Oracle e o aplicativo em desenvolvimento, dando mais agilidade, segurança e performance na troca dos dados diretos com o servidor.

O componente é composto por 36 Controles de propriedades, 6 Métodos de utilização e diferente do OO4O, ele inclui 8 Eventos, para manipulação de DBGrids, múltiplos Dynasets e múltiplas conexões.

Esse é um bom recurso para programadores de tecnologia que aceitam controle de dados visual, permitindo ter todas as opções de controle sobre os registros que o Oracle oferece e ainda melhorar a sincronização entre cliente e servidor.

Conhecendo o OO4O na prática

Para conhecer melhor o componente e entender a utilização de cada objeto e método, nada melhor que fazer um sistema desenvolvido em ASP 3.0 com um banco de dados Oracle 9i e escolher um tema para colocar em prática a maioria dos serviços.

Para se torna mais cômodo, projetei um sistema e abaixo está sua descrição.

NOTA:

Todo o sistema está desenvolvido em um único arquivo, apenas um arquivo externo em CSS para dar interatividade aos links e o nome para a criação das tabelas, views e alias são de total escolha do programador.

* Preparando o banco de dados

Para conseguimos executar o sistema sem erros e problemas. Temos que tomar algumas medidas perante ao banco de dados.

1º) Verificar o usuário de acesso.

Temos que ter um usuário com todos os privilégios no banco de dados, privilégios para SELECT, INSERT, UPDATE, DELETE e VIEWS. No exemplo utilizei um como GRANT DBA. Fica ao critério do DBA ou PROGRAMADOR da empresa, manter as permissões do usuário. Pois será com este usuário a iniciação de uma sessão do aplicativo com o banco de dados.

2º) Criar as tabelas e Views.

O sistema possui uma comunicação com 2 tabelas, onde há um campo para relacionamento e uma VIEW que traz os nomes dos usuários cadastrados no sistema geral, apenas para visualização, abaixo está o código para cria-las.

TABELA RA_USUARIOS_TAB

create table RA_USUARIOS_TAB
(
  USER_ID          VARCHAR2(30) not null,
  USER_GRP_RLS     VARCHAR2(30) not null
);

TABELA RA_GRUPOS_TAB

create table RA_GRUPOS_TAB
(
  USER_GRP_RLS      VARCHAR2(30) not null,
  RELEASE_AMOUNT    NUMBER
);

TABELA RA_USUARIO_TAB

create table RA_USUARIO_TAB
(
  IDENTITY       VARCHAR2(30) not null,
  ROWVERSION     NUMBER not null,
  DESCRIPTION    VARCHAR2(2000) not null,
  ORACLE_USER    VARCHAR2(30),
  WEB_USER       VARCHAR2(30),
  ACTIVE         VARCHAR2(5) not null
);

VIEW RA_USUARIO

CREATE OR REPLACE VIEW RA_USUARIO AS
SELECT identity         identity,
       description      description,
       oracle_user      oracle_user,
       web_user         web_user,
       active           active,
       rowid            objid,
       ltrim(lpad(to_char(rowversion),2000)) objversion
FROM   fnd_user_tab
WITH   read only

OBSERVAÇÃO

Após criar as tabelas, principalmente a tabela RA_USUARIO_TAB, inserir registros dentro do banco de dados para poder efetuar os testes, pois sem registros poderá ocasionar alguns erros durante a execução do programa na parte de grupos.

Uma boa dica é criar Índices dentro do banco de dados para a tabela RA_USUARIO_TAB, no campo Oracle_user, isso deixará a performance do sistema mais rápido e deixará bem melhor as consultas.

* SISTEMA

clique aqui para baixar todo o sistema com todas as linhas comentadas, explicando a utilização de cada variável do sistema, objetos e métodos do Method OO4O.

Compreendendo alguns Erros do Method OO4O

Ao se programar com o Método OO4O podem ocorrer alguns erros que os programadores não esperam e ao mesmo tempo desistem de utilizar este método, são erros comuns gerados pelo motor OLAP da Oracle junto ao IIS.

Abaixo liste alguns erros comuns que o Method OO4O pode gerar e uma solução para contornar estes problemas.

ERROS
============================================

- Oracle Automation (0x800A01B8)

SQL execution error, ORA-01400: não é possível inserir NULL em ("USUARIO"."TABELA"."COLUNA")

SOLUÇÃO:

Para poder solucionar e adicionar registro ao bando de dados, verifique que esteja passando valores para o campo, pois quando ocorre este erro, o Dynaset está recebendo valores nulos. Se na tabela a coluna está como NOT NULL, automaticamente o OLAP irá gerar um erro.

- Oracle Automation (0x800A01B8)

OIP-04118: Attempt to update without edit or add operation

SOLUÇÃO:

Quando aparecer esse tipo de erro oferecido pelo ISS. Verifique no seu código o seu SELECT está com a opção FOR UPDATE no final e se realmente existe as opções Edit ou AddNew.

- Oracle Automation (0x800A01B8)

OIP-04108: Invalid row reference

SOLUÇÃO:

Seu SELECT ou parametros está chamando uma coluna inválida no banco de dados, para resolver de um DESC NOME_TABELA no SQL*PLUS e veja se todas as colunas do seu SELECT está escrito de forma correta ou no seu SELECT ao passar um valor após a cláusula WHERE, este valor está chegando nulo.

- Oracle Automation (0x800A01B8)

OIP-04127: For Update detected with no active transaction

SOLUÇÃO:

Ao criar um Dynaset para poder inserir, alterar e deletar dados, terá que ter iniciado uma transição de sessão com o banco de dados, com OraSession.BeginTrans antes de criar o Dynaset e depois de fechar o Dynaset efetuar um COMMITTRANS ou ROLLBACKTRANS, e verificar se seu SELECT está com a opção FOR UDATE no final para permitir a edição no banco de dados.

LEMBRETES:

* Sempre ao utilizar o método OO4O com os métodos Edit, AddNew e Delete, usar os SELECTs com a opções FOR UPDATE no final da instrução, para não ocorrer erros.

* Ao fazer alguma edição no registros ou qualquer tipo de alteração no banco de dados executar sempre após o BeginTrans as opções COMMIT ou ROLLBACK.

Conclusão

Após termos obordado todas as informações do Method OO4O, deu para compreender a sua utilização no dia-a-dia do programador para trabalhos feitos em cima de base de dados Oracle, onde há uma certa complicação ao desenvolver.

Esse método é muito pouco utilizado, porque existe muito pouco conteúdo sobre ele na internet e em livros, contudo espero ter abordado ao máximo o assunto, sendo que não foi um estudo profundo sobre o componente.

Rodrigo da Silva Almeida

Rodrigo da Silva Almeida