sexta-feira, maio 27, 2005

Oracle – Replicação Avançada

Apesar de causar temores a algumas pessoas, inclusive a mim em um primeiro momento, a replicação avançada do Oracle é fácil de ser configurada e funciona perfeitamente.
Primeiro vamos analisar quais são as vantagens dessa replicação:
1) Permite alteração nos dois sites;
2) Se o link ou um dos servidores estiver fora do ar, o trabalho continua, e os servidores serão sincronizados no momento que a conexão for restabelecida.
3) Permite configurar a resolução de conflito, ou seja, se um mesmo dado for alterado nos dois sites ao mesmo tempo, você pode definir uma regra para tratar este caso. Por exemplo, vale o registro que foi alterando por último.
4) A replicação é rápida e leve (não causa grande trafego na rede), pois são replicadas apenas as alterações na base de dados e não a tabela inteira, como outras soluções.
5) O processo não é on-line, evitando travamentos devido a lock. Os dados são alterados em um site e só depois da operação concluída, são replicados para o outro site.
6) O tempo de replicação pode ser configurado com o intervalo desejado, ou seja, a replicação pode ocorrer a cada 1 segundo ou de 4 em 4 horas.
7) Você pode definir quais objetos serão replicados e o intervalo de replicação para cada um.

No link que se encontra no título deste artigo, você pode obter todos os scripts necessários para você trabalhar com a replicação avançada.

Para você que vai trabalhar com a replicação avançada pela primeira vez, sugiro que siga os seguintes passos para os primeiros testes:
1) Instale dois servidores Oracle do zero, lembrando de marcar a opção de Replicação Avançada no momento da criação do banco de dados;
2) A configuração GLOBAL_NAMES deve estar marcada ( Arquivo init.ora ou configuração da instancia do Oracle).
3) Os DBLinks devem ter o mesmo nome da configuração da instancia do Oracle (DBlink tem de ser igual ao Global Names da instancia de destino - execute select global_name from global_name no banco de dados de destino do DBLink )
4) Siga o script corretamente (Já montei duas replicações utilizando o Oracle 8.1.7 e funcionam perfeitamente).

Caso você já possua um servidor e deseje habilitar a replicação avançada, você deve seguir os passos do seguinte link http://www-rohan.sdsu.edu/doc/oracle/server803/A53722_01/ch6.htm#1021276 .

Boa Sorte.

Oracle – Problemas com o DBLink

Criar um DBLink é um processo simples e muito utilizado hoje em dia. No link que se encontra no título deste artigo, você pode obter todas as informações necessárias sobre DBLink.
O meu problema foi que o meu DBLink nunca funcionava. Eu possuía a seguinte configuração
Servidor Origem : DB01
Servidor Destino : DB02
Nome do DBLink : TESTE
O Oracle possui uma configuração GLOBAL_NAMES (Arquivo de INIT.ORA ou gerenciamento da instancia) e se essa configuração estiver como TRUE, que era o meu caso, o nome do DBLink deve ser igual ao nome da instancia do Oracle, ou seja, se estou tentando conectar a instancia DB02, o nome do meu DBLink deve ser DB02.
A configuração GLOBAL_NAMES = TRUE é necessária em casos que você precisa utilizar alguns recursos avançados do Oracle, entre eles a Replicação, que é o meu caso.
Caso você não utilize estes recursos, pode configurar o GLOBAL_NAMES = FALSE e utilizar o nome que quiser para o DBLink.

quarta-feira, maio 25, 2005

PowerBuilder - Conectando ao Oracle 10

Conversando com a equipe da Sybase, fui informado que o PowerBuilder ( a Sybase fornece suporte a versão 8,9 e 10) não possui um mecanismo para conexão ao Oracle 10. A previsão de liberar em breve o suporte ao Oracle 10 (PBO10xx.DLL ). Enquanto isso, é recomendado que se utilize a API para Oracle 9 (O90 driver) ou utilizar a conexão OLE DB.
Veja o Link no Título deste Post para mais informações.

terça-feira, maio 24, 2005

SQL Server - Performance 2005 X 2000

No link acima, vocês podem verificar um teste básico que demonstra a melhora de performance do SQL Server 2005 com relação ao SQL Server 2000. Neste teste, o SQL Server 2005 obteve um ganho de performance de 18,5 % com relação ao SQL Server 2000.

Oracle 8 – Perder a Senha do usuário internal ou sys

Se ocorrer a perda do usuári0o internal ( utilizado para criar, apagar ou editar uma instancia do Oracle), você pode utilizar os seguintes passos para resetar o senha

1 – Vá ao command, na pasta $ORACLE_HOME/bin
2 – Digite o comando orapwd80 file= senha=
Neste ponto será gerado um arquivo que você utilizará para substituir o arquivo do Oracle que armazena este senha criptografado,
3 – vá ao diretório $ORACLE_HOME/database e mud o nome do arquivo PWD.ORA para PWD.OLD ( este arquivo pode estar oculto e o windows configurado para não exibi-lo)
4 – Mude o nome do arquivo que você gerou no passo 2 para PWD.ORA
5 – Utilize o novo senha

Boa Sorte.

sexta-feira, maio 20, 2005

Microsoft Visual Source Safe - Melhorando a Performance

Está melhoria de perfomance se aplica principalmente para quem trabalhou com as versões anteriores do VSS.
Ao instalar o VSS 6, não é feito upgrade da base de dados, o que pode gerar uma perda de performance na utilização do VSS. Para obter uma melhor performance, siga os passos abaixo:
1) Verifique se a sua base já está atualizada. Para isso, verifique se existe a pasta ...\VSS\data\labels . Caso exista, não é necessário seguir este procedimento, pois a sua base já se encontra atualizada
2) Certifique-se que nenhum usuário está utilizando o VSS
3) Faça um backup do VSS
4) Execute o comando “DDUPD \\server\share\vss\data
Boa sorte.

quinta-feira, maio 19, 2005

Oracle - Respostas para as dúvidas sobre Replicação

Neste Link, você poderá obter todas as respostas sobre as questões relativas a replicação de dados do Oracle.

PowerBuilder – Implementando Single-Threaded Apartments

É possível implementar uma aplicação Single-threaded Apartments utilizando o PowerBuilder, o mesmo recurso utilizado para MultiThread no VisualBasic 6.
Primeiro deixa-me explicar o que é isso? Single-threaded Apartments é o processo de simular MultiThread, ou seja, N processos executarem ao mesmo tempo dentro da mesma aplicação, por exemplo, hoje quando você executa um comando SQL ou uma Procedure a aplicação fica travada até o momento em que a aplicação retorna o resultado do comando SQL. Com MultiThread, a aplicação não fica travada, permitindo você executar N consultas\procedures ao mesmo tempo, trabalhando em paralelo.
A diferença o MultiThread verdadeiro para o Single-threaded apartments é que o primeiro permite utilizar N processadores (Varias threads), pois utiliza área de memória diferente e o segundo utiliza apenas um processador (Uma thread), pois compartilha área de memória.
O processo de implementação do Single-threaded apartments é simples é funciona bem. Na verdade você tem que ter um objeto que é Thread, um para gerenciar o processo e outro para fazer a comunicação entre os dois.Para os interessados no código para essa implementação, me envie um comentário com o e-mail que eu repasso um pequeno exemplo dessa implementação.

SQL Server - Problemas na replicação com troca de nome do servidor.

Quando você está tentando configurar a replicação no SQL Server 2000 e recebe a mensagem:
SQL Server Enterprise Manager could not configure '\' as the Distributor for '\' . Error 18483: Could not connect to server '\' because 'distributor_admin' is not defined as a remote login at the server.
Geralmente, este erro ocorre porque o servidor SQL Server foi Renomeado ou foi montado a partir da imagem de outro servidor.Para resolver o problema, clique no Link deste artigo que irá direcioná-lo para a página da Microsoft com a solução para o mesmo.

quarta-feira, maio 18, 2005

PowerBuilder - Pesquisa 2005

Abaixo está um link para a pesquisa realizada pelo Sybase sobre a utilização do PowerBuilder
http://www.visual-expert.net/survey/survey.php?TEMPL=survey_pb_2005_us.htm

Esta pesquisa é anual, se quiser ver o resultado da pesquisa no ano passado, verifique o link abaixo.
http://www.visual-expert.com/us/info/survey_pb_2004_results.htm.

terça-feira, maio 10, 2005

PowerBuilder – Trace de Banco de Dados

O PowerBuilder possui um Trace que pode nos ajudar muito. Este trace grava em um arquivo todos os comandos que foram executados pelo aplicativo, incluindo o tempo gasto e as mensagens de erros que ocorreram.

Com o resultado do trace gerado, você pode descobrir um erro que está ocorrendo na base de dados ou melhorar a performance de uma rotina, através dos tempos retornados pelo Trace.

Para habilitar o Trace, você deve incluir a palavra TRACE antes do DBMS na conexão com o banco de dados, por exemplo:

// Profile DBTeste
SQLCA.DBMS = "TRACE O84 Oracle8/8i (8.x.4+)"
SQLCA.LogPass = <*********>
SQLCA.ServerName = "DB_DES"
SQLCA.LogId = "teste"
SQLCA.AutoCommit = False
SQLCA.DBParm = "CommitOnDisconnect='No',DelimitIdentifier='No',PBCatalogOwner='teste'"

Uma dica é adaptar a aplicação de forma que o trace possa ser habilitado através de uma chave do registry, assim você pode habilitar o Trace em qualquer momento, diretamente no executável.
Para analise de performance, desenvolvi um aplicativo que lê o trace e retorna os comandos que gastaram mais tempo. Quem tiver interesse neste aplicativo, envie um e-mail para tpereira@rtconsult.com.br, para que eu possa enviar o aplicativo.

sexta-feira, abril 29, 2005

PowerBuilder - Criação de DataWindow/DataStore Dynamica

O Exemplo abaixo, mostra como criar uma DataWindow/DataStore dinamicamente, a partir de um SQL.

string VLSerror_syntaxfromSQL, VLSerror_create, VLSnew_syntax, VLSMsgErr, VLSDescricao, VLSLinha Long VLLRow, VLLCodigo, VLLRet, vltotitens
// botão p/ seleção de ocorrências if dwo.name = 'b_ocorr' then lb_ocorr.Visible = True // sql p exibição das ocorrências no listbox VISnew_sql = 'select distinct mi.num_seq_ocorr_prioritaria codigo, oc.dsc_res_ocorr descricao ' + & 'from movto_inspecao mi, ocorrencia oc ' + & 'where mi.num_seq_ocorr_prioritaria = oc.num_seq_ocorr ' + & 'and mi.num_seq_ocorr_prioritaria is not null ' + & 'and mi.cod_proj = ' + String(VILProjOrig) end if
// botão p/ seleção de impedimentosif dwo.name = 'b_imped' then lb_imped.Visible = True // sql p exibição das impedimentos no listbox VISnew_sql = 'select distinct mi.cod_imp_insp codigo, im.dsc_imp_insp descricao ' + & 'from movto_inspecao mi, impedimento_inspecao im ' + & 'where mi.cod_imp_insp = im.cod_imp_insp ' + & 'and mi.cod_imp_insp is not null ' + & 'and mi.cod_proj = ' + String(VILProjOrig)
end if
// Monta dinamicamente o objeto datastore contendo as ocorrências ou impedimentos p/ seleçãoVLSnew_syntax = wtr_trans.SyntaxFromSQL(VISnew_sql, "", VLSerror_syntaxfromSQL)if Len(VLSerror_syntaxfromSQL) > 0 then VLSMsgErr = 'Erro: '+ VLSerror_syntaxfromSQL f_msg(VLSMsgErr, stopsign!) return 1else VLLRet = VIDSSelecao.Create(VLSnew_syntax, VLSerror_create) if Len(VLSerror_create) > 0 or VLLRet <> 1 THEN VLSMsgErr = 'Erro: '+ VLSerror_create f_msg(VLSMsgErr, stopsign!) return 1 end ifend if
VIDSSelecao.SetTransObject(wtr_trans)VIDSSelecao.Retrieve()

Site do Celso Cortes

Excelente site de tecnologia contendo informações diversas sobre tecnologia. Vale a pena fazer uma visita!

quarta-feira, abril 27, 2005

PowerBuilder - Mudança de automática da Resolução do Monitor

Na CFLCL, houve a necessidade de se mudar a resolução de todos os monitores, automáticamente, para a configuração 1024X 768.
Para isso, usamos o sequinte código abaixo.

$PBExportHeader$w_res.srw$PBExportComments$change resolutionforwardglobal type w_res from windowend typetype cb_2 from commandbutton within w_resend typetype cb_1 from commandbutton within w_resend typetype devmode from structure within w_resend typeend forward
type devmode from structure character dmdevicename[32] integer dmspecversion integer dmdriverversion integer dmsize integer dmdriverextra long dmfields integer dmorientation integer dmpapersize integer dmpaperlength integer dmpaperwidth integer dmscale integer dmcopies integer dmdefaultsource integer dmprintquality integer dmcolor integer dmduplex integer dmyresolution integer dmttoption integer dmcollate character dmformname[32] integer dmlogpixels long dmbitsperpel long dmpelswidth long dmpelsheight long dmdisplayflags long dmdisplayfrequency long dmicmmethod long dmicmintent long dmmediatype long dmdithertype long dmreserved1 long dmreserved2 long dmPanningWidth long dmPanningHeightend type
global type w_res from windowinteger x = 837integer y = 388integer width = 795integer height = 496boolean titlebar = truestring title = "Untitled"boolean controlmenu = trueboolean minbox = trueboolean maxbox = trueboolean resizable = truecb_2 cb_2cb_1 cb_1end typeglobal w_res w_res
type prototypesFUNCTION long ChangeDisplaySettingsA (ref devmode lpst, ulong Flags) & LIBRARY "USER32.DLL"FUNCTION long EnumDisplaySettingsA (string lpszDeviceName,long iModeNum,ref devmode lpst) & LIBRARY "USER32.DLL" end prototypes
type variables
end variableson w_res.createthis.cb_2=create cb_2this.cb_1=create cb_1this.Control[]={this.cb_2,&this.cb_1}end on
on w_res.destroydestroy(this.cb_2)destroy(this.cb_1)end on
type cb_2 from commandbutton within w_resinteger x = 224integer y = 220integer width = 297integer height = 88integer taborder = 2integer textsize = -10integer weight = 400fontpitch fontpitch = variable!fontfamily fontfamily = swiss!string facename = "Arial"string text = "1024x768"end type
event clicked;devmode dmlong astring ls_nulosetnull(ls_nulo)
//get current configurationa = EnumDisplaySettingsA(ls_nulo,-1,dm)
if a = 0 then messagebox('EnumDisplaySettingsA',"error") returnend if
//set configurationdm.dmPelsWidth = 1024dm.dmPelsHeight = 768
//Change current configurationa = ChangeDisplaySettingsA(dm, 0)if a < 0 then messagebox('ChangeDisplaySettingsA',"error") returnend if end event
type cb_1 from commandbutton within w_resinteger x = 224integer y = 124integer width = 297integer height = 88integer taborder = 1integer textsize = -10integer weight = 400fontpitch fontpitch = variable!fontfamily fontfamily = swiss!string facename = "Arial"string text = "800x600"end type
event clicked;devmode dmlong astring ls_nulosetnull(ls_nulo)
//get current configurationa = EnumDisplaySettingsA(ls_nulo,-1,dm)
if a = 0 then messagebox('EnumDisplaySettingsA',"error") returnend if
//set configurationdm.dmPelsWidth = 800dm.dmPelsHeight = 600
//Change current configurationa = ChangeDisplaySettingsA(dm, 0)if a < 0 then messagebox('ChangeDisplaySettingsA',"error") returnend if
end event

quarta-feira, março 30, 2005

Windows XP – Habilitando Remote Desktop Connection

A partir do Windows XP, já podemos utilizar o Remote Desktop Connection (uma versão light do Terminal Server), para simularmos uma sessão em uma máquina remota.
Para mim, a desvantagem do Remote Desktop em comparação com outros softwares ( VNC, Netmetting, PcAnyWhere e etc...) é que no momento que você conecta na máquina remota, a mesma é bloqueada, não permitindo que ninguém veja o que está ocorrendo. Por um lado e ruim, mas por outro é bom se levarmos em consideração a segurança.
Para habilitar essa funcionalidade em uma máquina em uma Rede Local, siga os seguintes passos (Em português):
1) Na maquina que será o Host ( Máquina na qual você irá conectar), siga os seguintes passos
a. Clique com o botão direito em Meu Computador e selecione propriedades
b. Vá a pasta Remoto e Habilite os dois CheckBoxes que existem. ( Se exibir uma mensagem, confirme)
c. Se o usuário que vai utilizar o Remote Desktop não for administrador da máquina local, clique no botão Selecionar usuários remotos e insira o usuário desejado.
2) Na máquina Guest ( Máquina que você irá utilizar para conectar a outra máquina ou Terminal Burro), siga os seguintes passos
a. Vá a Todos os Programas à Acessórios à Comunicação à Conexão a área de trabalho Remota ( No Windows Xp, está opção já existe por default. Em outros sistemas operacionais, o software deve ser baixado da Web e instalado http://www.microsoft.com/windowsxp/downloads/tools/rdclientdl.mspx )
Boa Sorte!!

PowerBuilder – Erro no Layout

Em algumas situações, notamos que o PowerBuilder começa a cancelar (Fechar, GPF e etc…) quando abrimos alguns objetos. Muitas vezes, apenas de abrir o PowerBuilder já ocorre erro, isso porque ele tenta abrir o objeto que está causando erro e o mais inacreditável é que o erro só ocorre em uma máquina especifica e muitas vezes, apenas com um usuário específico.
Este problema ocorre porque o Layout do PowerBuilder corrompeu. O Layout é responsável por posicionar os frames de uma janela e armazena a última configuração que foi salva. Além disso, o Layout é especifico de máquina e usuário, por isso, muitas vezes ocorre apenas para um usuário especifico.
Para resolver este problema, você deve resetar o Layout do PowerBuilder. Existem duas formas de fazer isso:
1) Menu View à Layouts à Default
2) Apagar a chave do registry responsável pelo layout (HKEY_CURRENT_USER\Software\Sybase\PowerBuilder\9.0\Layout )

Mas, se mesmo assim o problema continuar ocorrendo, recomendo executar um Full Build e um Optimize nas PBls.

quarta-feira, março 23, 2005

PowerBuilder – Recuperando informações de um Arquivo

A partir do PowerBuilder 8, temos a opção de informar no projeto qual a versão do nosso executável, mas não conseguimos recuperar essa informação de forma fácil.
Abaixo está o código necessário para recuperar as informações ou matadados de um arquivo.



//*****************Declare as seguintes external functions
FUNCTION ulong GetFileVersionInfoSizeA( REF string lpFilename, REF ulong lpdwHandle ) LIBRARY "version.dll"
FUNCTION integer GetFileVersionInfoA( REF string lpFilename, REF ulong lpdwHandle, ulong dwLen, REF string lpData ) LIBRARY "version.dll"
FUNCTION boolean VerQueryValueA( REF string lpBlock, string lpSubBlock, REF long lpBuffer, REF uint puLen ) LIBRARY "version.dll"
SUBROUTINE CopyMemory ( REF string d, long s, long l ) LIBRARY "kernel32.dll" ALIAS FOR RtlMoveMemory

//*******Código utilizado para recuperar o número de versão do produto no executável
string vls_filename, vls_Buff, vls_key
ulong vlul_Handle, vlul_Length
integer vli_rc
long vll_pointer
uint vlui_length

//Busca o tamanho do buffer do aplicativo
vlul_Length = GetFileVersionInfoSizeA( p_nom_executavel, vlul_Handle )
IF vlul_Length <= 0 THEN
return error.of_popula( populateerror(1010, 'Não foi possivel localizar o arquivo para o controle de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

vls_Buff = Space( vlul_Length )

//Busca o ponteiro para as informações do executavel
vli_rc = GetFileVersionInfoA( p_nom_executavel, vlul_Handle, vlul_Length, vls_Buff )

IF vli_rc = 0 THEN
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar informação de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

//Define qual informação sera recurperada
//Onde \StringFileInfo\\
//vls_key = "\StringFileInfo\040904e4\FileVersion"
vls_key = "\StringFileInfo\040904e4\ProductVersion"


IF NOT VerQueryValueA( vls_buff, vls_key, vll_pointer, vlui_length ) OR &
vlul_Length <= 0 THEN
p_versao = ""
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar o número da vesão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
ELSE
p_versao = Space( vlui_length )
CopyMemory( p_versao, vll_pointer, vlui_length )
END IF

return 1

segunda-feira, março 21, 2005

PowerBuilder 9 - About libraries

Whenever you save an object, such as a window or menu, in a painter, PowerBuilder stores the object in a library (a PBL file). Similarly, whenever you open an object in a painter, PowerBuilder retrieves the object from the library.
Assigning libraries
PowerScript targets can use as many libraries as you want. Libraries can be on your own PC or workstation or on a server. When you create a target, you specify which libraries it uses. You can also change the library search path for a target at any time during development.
For information about specifying the library search path, see "Specifying the target's library search path".
How the information is saved
Every object is saved in two parts in a library:
Source form This is a syntactic representation of the object, including the script code.
Object form This is a binary representation of the object, similar to an object file in the C and C++ languages. PowerBuilder compiles an object automatically every time you save it.
Using libraries
It is hard to predict the needs of a particular application, so the organization of a target's libraries generally evolves over the development cycle. PowerBuilder lets you reorganize your libraries easily at any time.
About library size
For small applications, you might use only one library, but for larger applications, you should split the application into different libraries.
There are no limits to how large libraries can be, but for performance and convenience, you should follow these guidelines:
Number of objects It is a good idea not to have more than 50 or 60 objects saved in a library. This is strictly for your convenience; the number of objects does not affect performance. If you have many objects in a library, list boxes that list library objects become unmanageable and the System Tree and Library painter become more difficult to use.
Balance Managing a large number of libraries with only a few objects makes the library search path too long and can slow performance by forcing PowerBuilder to look through many libraries to find an object. Try to maintain a balance between the size and number of libraries.
Organizing libraries
You can organize your libraries any way you want. For example, you might put all objects of one type in their own library, or divide your target into subsystems and place each subsystem in its own library.
Sharing objects with others
PowerBuilder provides basic source control using the PBNative check in/check out utility. PBNative allows you to lock the current version of PowerBuilder objects and prevents others from checking out these objects and modifying them while you are working on them.
The project administrator must design a directory hierarchy for the project's workspace. The administrator might create a separate subdirectory for each target in the workspace, or for each PBL in the workspace. After the administrator sets up the project and registers every object in the workspace, individual developers copy a template workspace to their own computers, open the workspace, and connect to source control.
PowerBuilder also provides a direct connection to external SCC-compliant source control systems.
For more about using PBNative and other source control systems, see "Using a source control system with PowerBuilder".

sexta-feira, março 18, 2005

PowerBuilder – Pegando Valores em um ComputedField

Normalmente, pegamos valores em uma coluna na DataWindow e para isso utilizamos o GetItem.
Em algumas situações, precisamos de um valor de um ComputedField, o que também é um processo simples, mas pode se tornar chato se você precisar fazer este processo para vários campos.
A solução que encontrei para este problema é criar uma função que recupera o valor de um computedField.
Abaixo está o código necessário para a criação desta função:

// DESCRIÇÃO:
// * Pega o valor de um campo ComputeField
// * Similar ao GetItem, mas funciona para ComputeFiled
//
// ARGUMENTOS DE ENTRADA:
// adw_controle : DataWidow onde se encontra o Compute
// as_compute : Nome do ComputedField
// al_row : Numero da linha que deseja busca o valor. Se for um compute
// que se encontra no Header ou no
//
// RETORNO:
// * "" : Não conseguiu encontra o valor
// * <> de "" : Valor processado
//
// OBSERVAÇÃO:
//
// CRIADO POR :
// 17/03/2005 - Thiago Campos Pereira
// ALTERADO POR :
//
//========================================================================

string vls_retorno
string vls_expressao
vls_expressao = as_compute + ".Expression"
//Pega a expressão do compute
vls_expressao = adw_controle.Describe(vls_expressao)


//busca o valor
vls_retorno = "evaluate('"+vls_expressao+"', "+string(al_row)+")"
vls_retorno = adw_controle.describe(vls_retorno)
return vls_retorno

terça-feira, março 15, 2005

Oracle – Trabalhando com campos auto-incremental

O campo auto-incremental é o campo um campo numérico onde o valor é gerado automaticamente a partir de algumas informações.
No Oracle, este campo é conhecido como SEQUENCE.
Para trabalhar com este campo no Oracle, devemos seguir os seguintes passos:

1) Criar a tabela com um campo numérico, que será utilizado como auto incremental
create table ATUALIZACAO_LOG
(
SEQ_LOG NUMBER not null,
COD_EMPRESA NUMBER(5) not null,
COD_TELA NUMBER(38) not null,
CHAVE VARCHAR2(300) not null,
INICIO DATE not null,
FIM DATE null ,
TIP_LOG CHAR(1) not null
constraint CKC_TIP_LOG_LOG check (TIP_LOG in ('I','A','E','P')),
SIGLA_USUARIO VARCHAR2(20) not null,
HISTORICO VARCHAR2(300) not null,
constraint PK_ATUALIZACAO_LOG primary key (SEQ_LOG)
)
/
2) Definir um objeto do tipo SEQUENCE, com as suas configurações
CREATE SEQUENCE SEQ_ATUALIZACAO_LOG
START WITH 1
INCREMENT BY 1
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER
/
Onde:
START WITH : Posição inicial
INCREMENT BY : Valor a ser incrementado.
3) Gerar o próximo valor

select SEQ_ATUALIZACAO_TELA.nextval
into Proximo_valor
from dual

4) Incluir na tabela

insert into ATUALIZACAO_LOG values(Proximo_valor, cod_empresa, cod_tela, upper(:as_chave), dt_now, dt_now, tip_log, upper(sigla_usuario), upper(historico) )