Announcement

Collapse
No announcement yet.

Spoolen in einer Datei aus der Prozedur

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

  • Spoolen in einer Datei aus der Prozedur

    Hallo zusammen,

    gibt es die Möglichkeit spoolen die Ausgabe von SQL-Anweisung in eine Datei aus der Prozedur oder Funktion?

    Gruß
    Leonid

  • #2
    Hallo Leonid,

    im SQL*Plus kannst du das Spoolen mit spool <I>Dateiname</I> ein und mit spool off wieder ausschalten. Ansonsten sieh dir mal das Package UTL_FILE an.

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      danke für die Antwort.
      Mit dem folgendem skript spoole ich die Ausgabe von SELECT-Anweisung in eine Datei. Dann aktualisiere ich alle abgearbeiteten Zeilen.

      -------------------
      set echo off
      set verify off
      set pagesize 0
      set termout off
      set heading off
      set feedback off

      spool c:\Temp\test_info.lst
      select id||'|'||date||'|'||firname||'|'||secname||'|'||hi redate||'|'||las
      from test
      where las is null
      /
      spool off

      update test
      set las = 'x';

      commit;

      set feedback on
      set heading on
      set termout on
      set pagesize 24
      set verify on
      set echo on
      --------------------

      Jetzt möchte ich aber erst überprüfen, ob spool erfolgreich war, und nur dann
      aktualisieren. Wie kann ich das tun?
      UTL_FILE-Package passt nicht, weil ich dem Client nicht erlauben möchte etwas auf den Server zu schreiben.
      Oder kann ich mit UTL_FILE-Package die Datei auf dem Client speichern?

      Gruß

      Leoni

      Comment


      • #4
        Hallo Leonid,

        was meinst du mit "ob Spool erfolgreich war"?

        Du kannst das Update doch auf die Saetze einschraenken, die las = NULL haben:

        <PRE>
        UPDATE test
        SET las = 'X'
        WHERE las IS NULL;
        </PRE>
        Wenn es keine Saetze mit las = NULL gibt, wird auch nichts aktualisiert.
        Du kannst sogar mit der RETURNING - Anweisung (bitte im Manual unter UPDATE nachschauen) die geaenderten Daten zurueckliefern lassen.

        Hilft das??

        Gruss

        Stefa

        Comment


        • #5
          Hallo Leonid,

          SQL*Plus bietet meines Wissens nicht sehr viele Möglichkeiten zur gezielten Fehlerbehandlung. Wenn Du unbedingt mit einem Scrpit statt einer Procedure arbeiten möchtest, dann könntest du mit WHENEVER OSERROR oder WHENEVER SQLERROR zumindest auf entsprechende Fehler reagieren und dein Script mit EXIT abbrechen:
          <pre>WHENEVER OSERROR EXIT
          spool c:\Temp\test_info.lst
          select id||'|'||date||'|'||firname||'|'||secname||'|'||hi redate||'|'||las from test where las is null;
          spool off

          WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
          update test set las = 'x';

          commit; </pre>

          Gruß Fal
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Stefan,
            hallo Falk,

            danke euch!

            Falk, das ist das was ich gesucht habe.
            Aber jetzt rufe ich den Skript aus der Kommandozeile mit Hilfe von BR.CMD.
            BR.CMD sieht so aus:
            -------
            SQLPLUS scott/tiger@mydate1 @.\test.SQL

            IF ERRORLEVEL 1 GOTO TROUBLE
            IF ERRORLEVEL 0 GOTO ok
            GOTO ende

            :trouble
            ECHO Programm abgebrochen
            GOTO ende

            k
            ECHO Das war´s - ok

            :ende
            -------
            Beim Ausführen von dem Skript, und beim Generieren absichtlich ein Fehler im .sql-Skript (z.B. c:\Tevvvmp anstelle von c:\Temp)
            wird die Verbindung zu SQL*Plus abgebrochen und der BR.CMD-Skript gibt nich die Error-Meldung, also "Programm abgebrochen" aus.

            Kann ich irgendwie bei WHENEVER OSERROR EXIT
            ein Parameter ( z.B. 1, um der .cmd Skript an :TROUBLE ginge) übergeben?

            Danke.

            Gruß
            Leoni

            Comment


            • #7
              Also, ich habe es so gemacht:

              WHENEVER OSERROR EXIT 1

              Gruß

              Leoni

              Comment


              • #8
                Hallo Leonid,

                das EXIT für die Fehlerbehandlung folgt den gleichen Regeln wie der "normale" EXIT-Befehl von SQL*Plus: EXIT [SUCCESS|FAILURE|WARNING| n|variable|:BindVariable] [COMMIT|ROLLBACK]. Wobei n ein selbstdefinierter Fehlercode als Rückgabewert sein kann, variable kann eine beliebige SQL*Plus-Variable sein (z.B. SQL.SQLCODE) und Bindvariable eine zuvor über VARIABLE definierte Bindevariable.

                Gruß Fal
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment

                Working...
                X