Archive for the ‘oracle’ Category

Tips: Error ORA-00920 invalid relational operator GeneXus Oracle

sábado, mayo 11th, 2013

El problema se detecta en ejecución, resultado de una cláusula “where” mal armada.

Que fue lo que pasó?

En las últimas versiones de GeneXus, son sentencias válidas poner:

if atributo

cuando antes se tenía que poner

if atributo = true por ejemplo

Lo mismo pasa si en vez de un “if” lo tenemos en un “where”

Código de ejemplo:

For Each

Where …

Where PersonaCodigo

Defined by AtributoX

//Codigo …

EndFor

 

Puede ser que por error nos olvidamos de poner el “= a alguna cosa” en el for each para un atributo que no es boolean.

Esto por ahora GeneXus no lo está detectando ni al salvar, ni al especificar y si no prestamos atención a la navegación solo lo vamos a encontrar cuando el sistema intenta resolver la query generada.

Que en este ejemplo generó el siguiente código

 WHERE (T1.PersonaCodigo) AND ….

 

Aporte de Antonio de la Fuente. Muchas gracias!

Gracias por seguir mi blog.
Hasta la póxima,

Fabricio De los Santos

__________________________________________________________
Coaching and Mentoring GeneXus, ScrumMaster, Project Manager
K2B Tools Agent – The best Patterns Tool to integrate with GeneXus
www.fabriciodelossantos.com
www.delfasoft.com.br

ORA-01031: insufficient privileges

miércoles, marzo 31st, 2010

Numa consultoria que estava fazendo numa empresa, me topei com o problema aonde tinha instalado um banco de dados num pc com Windows que ninguém conhecia a senha do usuário system.
Eu precisava me conectar como system para criar um novo usuário.
Ao tentar me conectar como SYSDBA o resultado foi o erro ORA-01031: insufficient privileges

Ou seja abri o a janela de shell de windows e executei

c:\>sqlplus /nolog
SLQ>connect / as sysdba;
ORA-01031: insufficient privileges

Isto pode acontecer por vários motivos, um deles é porque não foi especificado que Oracle permita usar autenticação nativa, justamente para não permitir conexões como sysdba sem senha.

Para entrar como sysdba e poder trocar a senha do usuário system, procurei o arquivo sqlnet.ora que estava na pasta %ORACLE_HOME%\network\admin neste caso era C:\oracle\product\10.2.0\db_1\network\admin
e tirei o “#” que comentava a seguinte linha.

SQLNET.AUTHENTICATION_SERVICES= (NTS)

Fechei o shell de windows e abri de novo, repeti os comandos e consegui conectar como sysdba e trocar a senha do usuário system.

Depois novamente comentei a linha usando o caracter “#” para deixar tudo como era antes.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus – Agente K2B Tools

Veja meus blogs em:
www.fabriciodelossantos.com

 

“Produtividade ao 300% com GeneXus e …”



As K2BTools são um conjunto de ferramentas que conjugadas a GeneXus, colaboram fortemente no desenvolvimento de Aplicações Web ou na sua conversão desde ambientes Win ou telas de texto plano. Conte com Fabricio De los Santos, Agente K2B Tools, com 15 anos de experiência internacional em GeneXus, para tirar qualquer dúvida e seja mais PRODUTIVO.

Autonumber em GeneXus com ORACLE

lunes, marzo 29th, 2010

Quando marcamos um atributo como Autonumber = True em GeneXus com ORACLE, GeneXus cria 2 objetos no schema de Banco de Dados que definimos como usuário.
Estes objetos são:

1 Sequence
1 Trigger

Algo tipo assim:

CREATE SEQUENCE Nome_Atributo
START WITH 1
MAXVALUE 999999999999999999999999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER;

CREATE OR REPLACE TRIGGER AN$NNNNome_Atributo BEFORE INSERT ON Tabela_Atributo
FOR EACH ROW
BEGIN SELECT Nome_Atributo.NEXTVAL INTO :new.Nome_Atributo FROM DUAL; END;
/

Onde em AN$NNNNome_Atributo:

NNN = O número interno do Atributo na Base de Conhecimento GeneXus
Nome_Atributo = Nome que usamos para o Atributo em nossa TRN.

e Tabela_Atributo é o nome de Tabela que corresponde a nossa TRN em GeneXus.

A grande debilidade deste script usando a SEQUENCE está no CACHE.

Existem alguns problemas relatados com Sequence em ORACLE fazendo referência ao CACHE utilizado, e a prova está que se olhamos os identificadores internos de nossas tabelas criadas com GeneXus em ORACLE a medida que vamos inserindo registros vemos que estos Identificadores não são sempre uma sequência perfeita. Os números começam a pular, exemplo:

de 101,102,103, passa para 122,123, etc.

Uma alternativa que temos usado para corrigir isto, é alterar o CACHE de oracle para 2, simplesmente em sqlplus, usando o comando:

ALTER SEQUENCE Nome_Atributo CACHE 2;

Com isto evitamos que ORACLE reserve 20 números para esta SEQUENCE e depois por algum problema fique esse buraco em nossos identificadores.

Agora bem, quando temos muitas TRNs e queremos alterar o CACHE de todas, como fazemos?

Bem, o que devemos fazer nesse casso é montar um pequeno script que lendo o dicionário de ORACLE nos informe todas as sequences que temos criadas e anexando o texto que completa o comando nos daria como resultado nosso script.

Então o que fazemos é o seguinte:

Conectado ao sqlplus, com um usuário que tenha acesso ao Dicionário de Dados de Oracle e a vista User_sequences executamos o seguinte comando:

SELECT ‘ALTER SEQUENCE ‘||SEQUENCE_NAME||’ CACHE 2;’ FROM USER_SEQUENCES;

Cuidado em respeitar os espaços para que o texto resultado seja correto.
A saída deste select seria algo assim:

ALTER SEQUENCE Nome_Atributo1 CACHE 2;
ALTER SEQUENCE Nome_Atributo2 CACHE 2;
ALTER SEQUENCE Nome_Atributo3 CACHE 2;
ALTER …

onde Nome_Atributo1, 2, 3 … são os nossos atributos que foram criados como autonumber em todas nossas TRNs GeneXus.

Seu usuário não tem direito ao dicionário de ORACLE?
De permissões momentâneas de DBA ao seu usuário e quando se conecte de novo ao Banco de dados, vai conseguir.

Para dar essas permissões, conectado como System execute GRANT DBA to Usuário_Schema;

Onde Usuário_Schema é o usuário que você configura no GeneXus nas DBMS Options.

Espero este post seja de ajuda a Comunidade GeneXus.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus – Agente K2B Tools

Veja meus blogs em:
www.fabriciodelossantos.com

 

“Produtividade ao 300% com GeneXus e …”



As K2BTools são um conjunto de ferramentas que conjugadas a GeneXus, colaboram fortemente no desenvolvimento de Aplicações Web ou na sua conversão desde ambientes Win ou telas de texto plano. Conte com Fabricio De los Santos, Agente K2B Tools, com 15 anos de experiência internacional em GeneXus, para tirar qualquer dúvida e seja mais PRODUTIVO.

IMP-00017: following statement failed with ORACLE error 959: ORA-00959: tablespace ‘string’ does not exist

sábado, noviembre 28th, 2009

Como prometi tempo atrás estou tentando blogar os meus velhos rascunhos.

import done in WE8MSWIN1252 character set and AL16UTF16 NCHAR character set
IMP-00017: following statement failed with ORACLE error 959:
“CREATE TABLE “MINHATABELA” (“ARQCODE” CHAR(10) NOT NULL ENABLE, “ARQFIXED” BLOB NOT NULL ENABLE) TABLESPACE “MEUTABLESPACE” LOGGING NOCOMPRESS LOB (“ARQFIXED”) STORE AS (TABLESPACE “MEUTABLESPACE” ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10 NOCACHE STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1))”
IMP-00003: ORACLE error 959 encountered
ORA-00959: tablespace ‘MEUTABLESPACE’ does not exist
Este erro me deu alguns anos atrás alguma dor de cabeça, é problema dos campos blobs que em ORACLE fazem referência ao Tablespace na hora de importar um dmp. Se não existe um tablespace com o mesmo nome de origem ORACLE não consegue importar o DMP.

Solução:

CREATE TABLESPACE MEUTABLESPACE DATAFILE
‘D:\ORACLE\ORADATA\ORCL\MEUTABLESPACE.ORA’ SIZE 5M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL;

Espero ajude.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus – Agente K2B Tools
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

 

“Produtividade ao 300% com GeneXus e …”



As K2BTools são um conjunto de ferramentas que conjugadas a GeneXus, colaboram fortemente no desenvolvimento de Aplicações Web ou na sua conversão desde ambientes Win ou telas de texto plano. Conte com Fabricio De los Santos, Agente K2B Tools, com 15 anos de experiência internacional em GeneXus, para tirar qualquer dúvida e seja mais PRODUTIVO.

Exercício de tratamento de nulos com GeneXus 9 Web e .NET e Oracle 10g XE

viernes, diciembre 5th, 2008

Com o passar dos anos acabamos trabalhando com um padrão determinado e muitas vezes não paramos para pensar se existe outra forma de fazer as coisas até que algum dia é questionado por alguém.
Realmente é algo complicado de explicar assim de cabeça então achei melhor deixar documentado o funcionamento de GeneXus no meu parecer respeito aos nulos, e algumas considerações ao trabalhar com Oracle particularmente.

Existe uma propriedade em GeneXus chamada

Generate null for nullvalue

Por default ela traz o valor “no”

O que é que isso faz?

Isso faz que o ORACLE não grave NULL nos registros das tabelas.

Para caracteres grava ‘ ’

Para numéricos grava 0

Para datas grava 01/01/0001

Tudo bem, agora, se você quiser gravar NULOS como tem que fazer?

1) Trocar Generate null for nullvalue para “Yes”
2) Mudar a estrutura de sua transação para permitir que os atributos permitam nulo, veja a imagem.

Ok, então agora já está agora não vão aparecer meus registros em nulo.
Sinto informar que não.
Ainda tem um passo mais.

3) Se você atualiza códigos com procedimentos como por exemplo

New //envio
EnvioCodigo = 3
EnvioEstado = nullvalue(EnvioEstado)
EnvioValor = nullvalue(EnvioValor)
// EnvioData = nullvalue(EnvioData)
EndNew

Veja bem o atributo comentado e pode fazer o exercício com todos os atributos secundários.

Se você não tiver a função associada nullvalue(), GeneXus vai a carregar no registro o valor padrão de GeneXus, neste exemplo ‘01/01/0001’
Ahh ok, tudo bem então agora descomentando isso, sim está tudo certo?

Não. O mesmo acontece nas telas das transações. Se você não coloca o atributo na transação GeneXus vai a carregar no registro o valor padrão dele para os nulos.

Uma solução neste caso e colocar os campos nas telas e adicionar a propriedade “visible” com valor 0.

Exemplo:

Bem, mas ainda existe outra alternativa ainda melhor passada por Enrique Almeida que é a propriedade “Initialized not referenced atributes” que ela por default traz o valor = “yes” e se trocamos ela para “no” evitamos colocar nas telas e nos procs a regra nullvalue.

Quero aclarar que inicialmente não tinha mudado esta última propriedade, porque como comentei no início eu não tenho a costume de trabalhar com os nulos de ORACLE, mas agora com a enorme colaboração de Enrique acho que fica publicado um bom exemplo que pode tirar as dúvidas de muitos.

Retiro a sugestão para ARTech, já que está resolvido e muito bem.

Continuarei testando com combinações de constraints de banco e demais.

Muito obrigado Enrique.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

EXP-00003: no storage definition found for segment

domingo, septiembre 14th, 2008

Estava tentando levar uma aplicação feita em GeneXus 8 para GeneXus X, e tudo tranquilo respeito a GeneXus, mas a dor de cabeça foi com Oracle.

EXP-00003: no storage definition found for segment

Este problema acontece quando tentamos exportar um esquema de banco de dados com uma versão antiga do cliente 9 de oracle, comentado no metalink de oracle, com o Doc ID: Note:274076.1

Uma alternativa para não atualizar o cliente é rodar o seguinte script antes de executar o export para alterar a view exu9tne

create or replace view exu9tne (tsno,fileno,blockno,length) as
select ts#, segfile#, segblock#, length from sys.uet$
where ext# = 1
union all
select * from sys.exu9tne;

Depois de fazer o export voltamos a deixar a view como estava antes

create or replace view exu9tne (tsno,fileno,blockno,length) as
select ts#, segfile#, segblock#, length from sys.uet$
where ext# = 1

Depois vai na frente.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

Ativar Auditoria em Oracle 10g XE

jueves, septiembre 11th, 2008

Muitas vezes queremos utilizar a auditoria interna de Oracle mas não sabemos se está ativa ou não.
Para verificar ou ativar a auditoria devemos fazer o seguinte:

Devemos nos conectar ao banco como sys

connect / as sysdba;

Primeiro checamos se a auditoria está ativada.

show parameter audit;

Se AUDIT_TRAIL=NONE não está ativa, então executamos:

alter system set audit_trail=db SCOPE=spfile;

Temos que baixar o banco

shutdown immediate;

E levantar de novo

startup open;

Consultamos os parâmetros novamente.

show parameter audit;

E agora já podemos começar a usar a auditoria de oracle.
Por exemplo executamos este comando:

audit alter table, insert table, delete table by nosso_usuario_a_auditar;

Conectamos com esse usuário e fazemos algumas operações de insert ou delete por exemplo.

Logo após consultamos a auditoria.

select * from aud$;

Existem muitas opções na hora de auditar, este exemplo é algo simples só para começar a entrar no mundo de auditoria de Oracle.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

ORA-12899: VALUE TOO LARGE FOR COLUMN

miércoles, agosto 27th, 2008

Tiempo atrás había postado un link que resolvía este problema bajo algunas circunstancias.
Tiempo después me encontré con el mismo problema en una máquina con otro sistema operativo, y tuve que aplicar otra solución y en ese momento no publiqué como lo solucioné. A pedido de Carlos, amigo visitante de mi sitio, quien me preguntó por email si existia alguna otra forma de solucionar este problema, acudí a mis apuntes y estoy dejando aquí 2 pasos que solucionaron mi problema particular en aquella época.

Básicamente este problema está relacionado con la conversión de caracteres de oracle, de un banco para otro. Léase NLS_CHARACTERSET.
Por tal motivo pido atención a ver cual es su problema en particular, para saber cual procedimiento aplicar, es por eso que dejo links relacionados, que me ayudaron a encontrar la solución en aquel momento.

Problema 1:

c:\sqlplus /nolog
conn / as sysdba;

select parameter,value from nls_session_parameters where parameter=’NLS_LENGTH_SEMANTICS’;
alter system set nls_length_semantics=CHAR scope=both;

shutdown e startup para verificar.

Problema 2:

c:\sqlplus /nolog
conn / as sysdba;
shutdown;
startup restrict;
Alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup open;

A continuación links de apoyo, que me ayudaron mucho y les estoy muy agradecido.

http://www.oracle.com/technology/oramag/oracle/03-mar/o23sql.html
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch2charset.htm#g1015066
http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/applocaledata.htm#i635016
http://users.telenet.be/oraguy.be/Characterset1.htm
http://www.oracle-base.com/articles/10g/CharacterSetMigration.php

Usted elija la opción y el character set que corresponda.

Fabricio De los Santos
Gerencia de Proyectos –
Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Erro de Oracle, reorganizando um atributo Caracter para um tamanho menor com GeneXus X

lunes, agosto 25th, 2008

Simplesmente tinha um campo Character(40) onde o tamanho era muito grande para o string a ser guardado nele.
A decisão foi de mudar para Character(9).
Na hora de reorganizar tive um erro que não podia reorganizar para um campo menor porque os dados não entravam na coluna.
Olhando os dados nenhum deles era maior a 9.
Existe uma diferença no banco de dados no tratamento de atributos CHAR e VarChar, espacio reservado, etc, para o tipo Varchar é menor.
Solução sem entrar no detalhe de porque isso estava acontecendo (ja que depois não consegui reproduzir novamente o erro), simplesmente passei o campo CHARACTER(40) para VARCHAR(40), e depois para VARCHAR(9), para por ultimo passar para CHAR(9) e não deu problemas.
Conclusão: O erro não sei porque aconteceu, mas o que sim é seguro que o length do string antes da conversão, não era maior que 9, já que após esses 3 passos CHAR -> VARCHAR -> CHAR, a tabela ficou como desejava sem problemas.

Não reportei este caso porque não consegui reproduzir, então acho que é um workaround válido se volta a acontecer.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com

ORA-01400 GeneXus X e Oracle

miércoles, agosto 20th, 2008

Este erro está prometido para ser corrigido em GeneXus logo em breve.
O problema é porque criamos uma tabela com uma chave primaria numérica.
E depois decidimos que ela seja autonumérica.
Então fomos nas propriedades do atributo e marcamos ele para autonumber = true.
Executamos a reorganização e tudo parece certo.
Mas na hora de executar, nos encontramos com esse problema.
O que aconteceu e que GeneXus não criou o trigger correspondente, e sim a sequência.

Bem, a solução é entrar no GeneXus novamente e marcar esse atributo para autonumber = false.

Executar F5 e GeneXus vai mostrar a sequência e o trigger a ser apagado.

Só que não vamos a apagar nada, vamos pegar a sentencia do trigger por exemplo:

DROP TRIGGER AN$ZZZNossoAtributo

(tem que marcar e com botão direito copiar, senão não vai)

para criar a mão o trigger no oracle da seguinte forma.

create or replace TRIGGER AN$ZZZNossoAtributo BEFORE INSERT ON NossaTabela FOR EACH ROW BEGIN SELECT NossoAtributo.NEXTVAL INTO :new.NossoAtributo FROM DUAL; END;

ZZZ é o número interno que identifica o atributo en GeneXus.

Listo, agora voltamos a GeneXus, cancelamos a reorganização e colocamos o atributo novamente com a propriedade de autonumber = true.

Fabricio De los Santos
Gerência de Projetos – Consultoria GeneXus –
ERP – Sistemas de Missão Crítica – Bancos de Dados.

Veja meus blogs em:
www.fabriciodelossantos.com