Question

Un peu d’arrière-plan en premier. Mon entreprise évalue si nous allons ou non migrer notre base de données Informix vers Oracle 10g. Nous avons plusieurs programmes ESQL / C. J'en ai déjà parcouru le workbench Oracle Migration et je me suis mal débrouillé lors des tests. Maintenant, je viens de réaliser quelques petites choses.

Premièrement, nous avons des instructions SQL dynamiques qui ne gèrent pas du tout les valeurs NULL. D'après ce que j'ai lu, je dois modifier manuellement les requêtes pour utiliser la fonction nvl () ou implémenter des variables d'indicateur. Quelqu'un peut-il confirmer si des modifications manuelles sont nécessaires? Moins nous aurons à apporter de modifications manuelles à nos programmes ESQL / C convertis, mieux ce sera.

Deuxièmement, nous avons plusieurs requêtes qui extraient des dates de différentes tables, etc. Dans Informix, les dates sont traitées comme des types longs, le nombre de jours depuis le 31 décembre 1899.

Dans Pro * C, quel format une date est-elle sélectionnée? Je sais que ce n'est pas numérique car j'ai essayé de sélectionner un champ de date dans ma variable longue et j'ai l'erreur d'erreur Oracle de préciser "NUMBER attendu, mais une date". Donc, je suppose que nous devrions modifier la façon dont nous sélectionnons les champs de date - soit sélectionner un champ de date de manière convertie afin qu'il devienne long (c'est-à-dire, le nombre de jours depuis le 31/12/1899), ou changer l'hôte variable correspondant à ce qu'Oracle renvoie (qu'est-ce que c'est, chaîne?).

Était-ce utile?

La solution

Pour convertir les dates Oracle (stockées au format interne Oracle) en un entier long, vous devez modifier vos requêtes. Utilisez la formule suivante pour vos dates:

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

Le format 'J' du système Oracle (pour la date julienne) est un décompte du nombre de jours depuis le 31 décembre 4712BC. Si vous souhaitez compter à partir d'une date ultérieure, vous devez soustraire le nombre de jours du calendrier Julien en date de cette date ultérieure.

Une suggestion: au lieu de modifier toutes vos requêtes dans vos programmes (ce qui peut créer des problèmes et introduire des bogues), créez un ensemble de vues dans un schéma différent. Ces vues porteraient le même nom que toutes les tables, avec les mêmes colonnes, mais incluraient les formules NVL () et date () (comme ci-dessus). Pointez ensuite votre application sur le schéma de vue plutôt que sur le schéma de la table de base. Beaucoup moins d'essais et moins d'endroits où rater quelque chose.

Par exemple, placez toutes vos tables dans un schéma appelé "APPS_BASE". (défini par l'utilisateur "APPS_BASE". Créez ensuite un autre schéma / utilisateur appelé "APPS_VIEWS". Dans APPS_VIEWS, créez une vue:

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

Autres conseils

Ya. Vous devrez modifier vos requêtes comme vous l'avez décrit.

longtemps vous fait trébucher. longtemps a une signification différente dans Oracle. Il existe un type de date spécifique. Généralement, lors de la sélection, on utilise la fonction TO_DATE avec un format, pour obtenir le résultat sous la forme d'un VARCHAR2, exactement au format souhaité.

Cela ne vous a probablement pas encore frappé, mais sachez que dans Oracle, les champs VARCHAR2 vides sont NULL. Je ne vois aucune logique derrière cela (probablement parce que je viens d'Informix) - gardez cela à l'esprit. Je pense que c'est stupide - chaîne IMHO vide est significatif et différent de NULL.

Modifiez tous vos champs VARCHAR2 pour qu'ils soient NOT NULL DEFAULT '-' ou toute autre valeur arbitraire, ou utilisez Indicateurs dans TOUTES vos requêtes renvoyant des champs VARCHAR2, ou utilisez toujours NVL ( ) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top