Announcement

Collapse
No announcement yet.

Curosr -Datumswert nach dem Tag abgeschnitten (automatisch in String umgewandelt?)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Curosr -Datumswert nach dem Tag abgeschnitten (automatisch in String umgewandelt?)

    Hallo,

    hab nen Cursor der Daten ausliest, u.a. die Spalte 'QUELLE_ZEIT'.
    Diese Spalte ist in der Tabelle als date deklariert. danach möchte ich die ausgelesenen Daten in einer anderen Tabelle speichern hier wiederum den Wert des Cursors.QUELLE_ZEIT in die Spalte QUELLE_ZEIT -> ist auch in der Zieltabelle als date deklariert.
    Problem:
    es wird mir immer der Datumswert nach dem Tag abgeschnitten, d.h. aus
    z.B. 24.11.2008 15:53:33 wird 24.11.2008 00:00:00.

    Weiss jemand warum? (wird vielleicht implizit in String umgewandelt? -> die recordvariable hat die identische Struktur wie die Tabelle => also ist dort auch QUELLE_ZEIT als date deklariert.

    hier der code

    Code:
    v_stmt := 'select * from NACHRICHT;
    
    open crs_nachricht_eintraege FOR v_stmt;
    loop
        fetch crs_nachricht_eintraege into rec_crs_nachricht_eintraege;
        exit when crs_nachricht_eintraege%NOTFOUND;
    
    	 v_stmt := 'insert into NACHRICHT_PROTOKOLLIERUNG (QUELLE_ZEIT) values ('''||rec_crs_nachricht_eintraege.QUELLE_ID||'''
    	execute immediate (v_stmt);
    
    
    end loop;
     close crs_nachricht_eintraege;
    Anmerkungen:
    - Ich habs schon ohne die ''' in der values Klausel versucht -> erfolglos
    - Ich weiss ich könnte es mit to_char und dann wieder mit to_date rückwandeln machen, aber das wiederstrebt mir irgendwie, da ich ein Datum einem Datum zuweisen will (wieso soll ich da hin und her wandeln)


    danke
    christoph

  • #2
    Uff. Also hier ist ja so ziemlich alles falsch gemacht worden was man falsch machen kann.

    1. Keine Bindvariablen verwendet (das ist auch der Grund für deinen Fehler.)
    2. PL/SQL wenn man die Aufgabe in einem einzigen Statement erledigen kann.

    Code:
    INSERT INTO NACHRICHT_PROTOKOLLIERUNG (QUELLE_ZEIT)
       SELECT QUELLE_ID FROM NACHRICHT;
    So und nicht anders.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hallo Dimitri,

      erstmal danke für Deine Antwort.

      Aber:
      Ist doch logisch, dass ich nur den wesentliche Auszug aus dem Quellcode gepostet habe.
      Dieser ist viel komplizierter. Ich kann beide Cursor erst zur Laufzeit zusammenbauen, ist also eigentlich dynamisches PL/SQL und es hängt auch noch einiges dazwischen => Dein zwar korrekter und trivialer Ansatz, ist bei mir völlig unbrauchbar...

      => mein Problem bleibt...

      Comment


      • #4
        Ist doch logisch, dass ich nur den wesentliche Auszug aus dem Quellcode gepostet habe.
        Dann solltest Du das aber auch schreiben. Im übrigen macht das die Art und weise wie Du Daten kopierst nicht richtiger, denn auch den von mir beschriebenen INSERT INTO kann man sich dynamisch zusammenbauen.

        Dein Problem liegt aktuell daran, dass Du keine Bindvariablen verwendest und Oracle daher erstmal einen impliziten Cast vornimmt wenn das Datum in einen String umgewandelt wird. Dort geht dann die Uhrzeit verloren.
        Die richtige Lösung (aber trotz allem noch falsche und sehr langsame Vorgehensweise) wäre daher:
        Code:
        EXECUTE IMMEDIATE 'insert into NACHRICHT_PROTOKOLLIERUNG (QUELLE_ZEIT) values (:1)' USING rec_crs_nachricht_eintraege.QUELLE_ID
        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          Hallo erstmal wieder danke....

          (das ganze läuft in verschachtelten Schleifen => deshalb muss ich es leider so kompliziert machen).

          (Ich dachte ich hätte durch den Text meine Absicht eindeutig beschrieben, und wollte durch vereinfachten code einfach nur ne Veranschaulichung bieten...sorry)

          versteh ich das richtig:
          wenn ich mit nem Cursor eine Abfrage auf ne Tabellenspalte des Typs date mache -> diese Abfrage dann in eine Variable des Typs date fetche (ist record mit %Type Zuweisung der date spalte) und dann diese Variable wieder in eine Tabellenspalte des Typs date eintrage => bei diesem Vorgang findet dann eine date-string umwandlung statt?

          danke
          christoph

          Comment


          • #6
            bei diesem Vorgang findet dann eine date-string umwandlung statt?
            Nein bei diesem Vorgang findet eine DATE-CHAR Konvertierung statt:
            Code:
            values ('''||rec_crs_nachricht_eintraege.QUELLE_ID
            Das Datum muss hier in einen String umgewandelt werden. Da Du kein to_char drum herummachst, macht Oracle das implizit und verwendet dazu die NLS Parameter des Clients.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Hallo Dim,

              erneut danke...
              klar, meinte char (wenn Du man dauernd zwischen JAVA - Delph und PL/SQL hin und her hüpfen musst, kommt man mal a bisserl durcheinander... ;-) )

              So ein mist... jetzt ist mir die implizite Konvertierung durch die String ähhh varchar2 Zuweisung vor die Augen gehüpft...ist ja eigentlich logisch...sorry, danke...
              (Wie gesagt, mehrere verschachtelte Cursor, insgesamt 10 verlinkte Datenbanken mit je bis zu 30 tabellen in der Abfrage usw. => brauche dynamisches SQL und eine recordvariable zum abspeichern der Cursorfetchdaten...) und das insert statement in einer eigenen varchar variable => muss mir was anders einfallen lassen...;-)

              danke

              Comment


              • #8
                muss mir was anders einfallen lassen...;-)
                Code:
                ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';
                Dim
                Zitat Tom Kyte:
                I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                Comment

                Working...
                X