Archive for the ‘oracle’ Category

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

Saturday, November 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

Friday, December 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

Sunday, September 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

Thursday, September 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

Wednesday, August 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

Monday, August 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

Wednesday, August 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

Que versão de Oracle estou executando

Tuesday, May 6th, 2008

Se estamos usando SqlPlus e queremos saber que versão de Oracle é o banco de dados ao que estamos conectado, a sentencias para decifrar são as seguintes:

SET SERVEROUTPUT ON SIZE 10000
DECLARE
VERSION1 VARCHAR2(59);
VERSION2 VARCHAR2(59);
BEGIN
dbms_utility.db_version(VERSION1,VERSION2);
DBMS_OUTPUT.PUT_LINE(VERSION1);
DBMS_OUTPUT.PUT_LINE(VERSION2);
END;
/

Version1, mostra a versão do banco de dados.
Version2, mostra com que versão é compatível a instancia, baseado na configuração setada no INIT.ORA, se este parâmetro de compatibilidade não está setado, devolverá null.

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

Como usar Case em Oracle

Tuesday, May 6th, 2008

(Postado originalmente no dia 23/04/07)

Pode acontecer que necessitemos devolver um texto ou valor dependendo dum dado duma coluna numa tabela Oracle.
Por exemplo:
Se temos uma tabela de nome Empleado_Salarios com os campos
Empleado, Salario
e com valores
Agustin, 20.000
Ignacio, 1.500
Nicolás, 10.000

E num “select” queremos em vez de mostrar os valores exatos e mostrar categorias, podemos usar a sentencia CASE de Oracle como mostra o seguinte exemplo.

Select Empleado,
CASE
when Salario < 5.000 then ‘Salario Bajo’
when Salario >= 5.000 and Salario < 15.000 then ‘Salario Medio’
else ‘Salario Alto’
END Categoria_Salario
from Empleados_Salarios;

A sentencia contem as palavras reservadas “when” para estabelecer as condições, “else” para o caso que não cumpra uma das condições when, e “CASE” e “END” que encerram a cláusula condicional, coloquei a palavra “Categoria_Salario” como alias duma coluna de categorias.

Outro exemplo simples poderia ser:
Tenho uma tabela de nome Stock com 3 campos:

Material char(20),
Entradas number(10),
Saidas number(10)

E quero saber os saldos positivos de Entradas - Saidas, e no caso que as Saidas sejam maiores que as Entradas, não quero mostrar o valor negativo, senão um valor 0.
Temos que ter em consideração os valores nulos que poderia ter de Entradas ou Saídas

O select seria o seguinte:

Select Material,Nvl(entradas,0) Entradas, Nvl(saidas,0) Saidas,
Case Nvl(entradas,0) - Nvl(saidas,0) > 0 then Nvl(entradas,0) - Nvl(saidas,0)
else 0
End Diferencia
from Stock;

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

Error ORA-00957 GeneXus Oracle duplicate column name

Monday, May 5th, 2008

(Postado originalmente no dia 17/04/07)

Duplicate column name ou ORA-00957 com oracle, no meu caso Visual Basic, se produz basicamente por um erro comum que pode acontecer.

Se deve basicamente a que possivelmente no código tanto seja num New ou num When Duplicate se está fazendo referencia a um atributo 2 vezes por erro.

Exemplo:

New
CliCod=&CliCod
CliNom=&CliNom
CliEnd=&CliEnd
CliEnd=&Endereco
EndNew

Também pode acontecer num When duplicate não documentado neste exemplo.
É um erro simples de cometer geralmente quando se copiam códigos de um objeto para outro.

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