Pergunta

Um pouco de fundo em primeiro lugar. Minha empresa está avaliando se deve ou não vamos migrar nosso banco de dados Informix para Oracle 10g. Temos vários programas ESQL / C. Já corri alguns através da bancada do Oracle Migração e ter sido muddling através de alguns testes. Agora eu vim a perceber algumas coisas.

Primeiro, temos instruções SQL dinâmicas que não estão lidando com valores nulos em tudo. Pelo que tenho lido, eu quer ter de modificar manualmente as consultas para utilizar a função NVL () ou implementar variáveis ??indicadoras. Alguém pode confirmar se as modificações manuais são necessárias? A menor quantidade de alterações manuais nós temos que fazer para nossos programas convertidos ESQL / C, melhor.

Em segundo lugar, temos várias consultas que puxam datas a partir de várias tabelas etc., e no Informix datas são tratados como tipo longo, o número de dias desde 31 de dezembro de 1899.

Na Pro * C, o formato é uma data a ser escolhida como? Eu sei que não é numérico, porque eu tentei selecionar campo de data em minha longa variável e obter erro do Oracle afirmando que "número esperado, mas tem um encontro". Então, eu estou supondo que nós teríamos que modificar a forma como estamos selecionando os campos de data - ou seleccione um campo de data de uma forma convertido para que ele se torna um longo (ou seja, número de dias desde 12/31/1899), ou alterar o host variável para coincidir com o que a Oracle está retornando (o que é isso, corda?).

Foi útil?

Solução

Para converter as datas oracle (que são loja no formato interno Oracle) em um inteiro longo, você vai precisar alterar suas consultas. Use a seguinte fórmula para suas datas:

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J'))

O sistema Oracle 'J' (para Julian data) formato é uma contagem do número de dias desde 31 de dezembro de 4712BC. Se você quiser contar a partir de uma data posterior, você precisa subtrair off a contagem Julian dia dessa data posterior.

Uma sugestão: em vez de alterar todas as suas dúvidas em seus programas (o que pode criar problemas e introduzir bugs), criar um conjunto de pontos de vista em um esquema diferente. Estes pontos de vista seria nomeado o mesmo que todos os mesas, com as mesmas colunas, mas incluem a NVL () e fórmulas date () (como acima). Em seguida, apontar a sua aplicação no esquema de vista, em vez do esquema da tabela base. Muito menos testes e menos lugares para faltando alguma coisa.

Assim, por exemplo, colocar todas as suas tabelas em um esquema chamado "APPS_BASE" (definido pelo usuário "APPS_BASE" Em seguida, crie outro esquema / usuário chamado "APPS_VIEWS" No APPS_VIEWS criar uma vista:..

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;

Outras dicas

Ya. Você precisará modificar suas consultas como você descreveu.

longa é tropeçar-lo. longa tem um significado diferente em Oracle. Há um tipo específico DATE. Geralmente quando selecionando um usa a função TO_DATE com um formato, para obter o resultado como um VARCHAR2, exatamente no formato que você quiser.

Provavelmente não bater-lhe ainda, mas esteja ciente de que no Oracle esvaziar campos VARCHAR2 são nulos. Eu não vejo nenhuma lógica por trás disso (provavelmente porque eu vim de terras Informix) - apenas mantê-la em mente. Eu acho que é estúpido - IMHO string vazia é significativo e diferente de NULL

.

De qualquer modificar todos os seus campos VARCHAR2 ser NOT NULL DEFAULT '-' ou qualquer outro valor arbitrário, ou usar apresentação de indicadores em todas as suas consultas que retornam campos VARCHAR2, ou usar sempre NVL().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top