Frage

Ein bisschen hintergrund zuerst.Mein Unternehmen ist die Bewertung, ob oder nicht, werden wir migrieren unsere Informix-Datenbank zu Oracle 10g.Wir haben mehrere ESQL/C-Programmen.Ich habe laufen einige durch die Oracle Migration workbench und wurden Durchwursteln einige Tests.Nun, ich bin gekommen, zu wissen, ein paar Dinge.

Zuerst, haben wir eine dynamische sql-Anweisungen, die nicht mit der Handhabung von null-Werten überhaupt.Von dem, was ich gelesen habe, die ich entweder manuell ändern, Abfragen zu nutzen, um die nvl ( ) - Funktion oder implementieren Indikator-Variablen.Kann jemand bestätigen, ob manuelle änderungen sind notwendig?Die wenigsten manuelle änderungen, die wir machen müssen, um unsere konvertiert ESQL/C-Programme, die besser.

Zweite, wir haben mehrere Abfragen, die pull-Daten aus verschiedenen Tabellen etc., und in Informix-Termine behandelt werden, als Typ long, der die Anzahl der Tage seit dem Dec 31, 1899.

In Pro*C, in welchem format ein Datum ausgewählt, wie?Ich weiß, es ist nicht numerisch ist, weil ich versucht Auswahl Datumsfeld in meinem langen, Variablen und erhalten Oracle-Fehlermeldung "erwartet ZAHL, aber got a DATE".Daher gehe ich davon aus, wir würden ändern müssen, wie wir die Auswahl der Datums-Felder - entweder wählen Sie ein Datumsfeld in einer Weise umgewandelt, so wird es eine lange (ie, # Tage, da 12/31/1899), oder ändern Sie die host-variable zu entsprechen, was Oracle zurückkehrt (was ist das, string?).

War es hilfreich?

Lösung

Um zu konvertieren, die oracle-Daten (die Sie speichern in der Oracle-interne format) in eine lange Ganzzahl ist, müssen Sie ändern Sie Ihre Abfragen.Verwenden Sie die folgende Formel für Ihre Termine:

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

Das Oracle-system " J " (für Julianisches Datum) format ist eine Zählung der Anzahl der Tage seit Dezember 31, 4712BC.Wenn Sie wollen, um zu zählen, von einem späteren Datum haben, müssen Sie subtrahieren off the Julian day count später Datum.

Ein Vorschlag:stattdessen verändern sich alle Ihre Anfragen in Ihren Programmen (das kann zu Problemen führen und stellen-bugs), erstellen Sie einen Satz von Ansichten, die in einem anderen schema.Diese Aussicht würde den gleichen Namen tragen wie alle Tabellen, alle mit den gleichen Spalten, aber gehören die NVL() und date () - Formeln (wie oben).Dann zeigen Sie Ihre Anwendung im Blick schema und nicht als Basis-schema für die Tabelle.Viel weniger Tests und weniger Orte, an etwas fehlt.

So zum Beispiel, legen Sie alle Ihre Tabellen in einem schema mit dem Namen "APPS_BASE" (vom Benutzer definiert "APPS_BASE".Dann erstellen Sie ein anderes schema/user namens "APPS_VIEWS".In der APPS_VIEWS erstellen Sie eine Ansicht:

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

Andere Tipps

Ya.Sie müssen ändern Sie Ihre Abfragen, wie Sie beschrieben.

lange ist tripping you up.lange hat eine andere Bedeutung in Oracle.Es gibt ein bestimmtes DATUM geben.In der Regel bei der Auswahl verwendet man die TO_DATE-Funktion mit einem format aus, um das Ergebnis, als VARCHAR2, in genau dem format, das Sie möchten.

Wahrscheinlich ist es nicht Sie getroffen, aber bewusst sein, dass in Oracle leer VARCHAR2 Felder sind Null.Ich sehe keine Logik hinter diesem (wahrscheinlich, weil ich kam aus der Informix-land) - nur halten Sie es in Geist.Ich denke, es ist dumm - IMHO leere Zeichenfolge ist sinnvoll und unterschiedlich von NULL.

Ändern Sie entweder alle Ihre VARCHAR2 Felder NOT NULL DEFAULT '-' oder jeden anderen beliebigen Wert ein, oder verwenden indicatores in ALLE Ihre Abfragen return VARCHAR2-Felder, oder benutzen Sie immer NVL().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top