Announcement

Collapse
No announcement yet.

automatisierter Spool

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

  • automatisierter Spool

    Hallo Zusammen,

    habe mal versucht, automatisch Spoolscripten zu erstellen. Leider mit nur mässige, Erfolg

    [highlight=sql]
    select 'select '||column_name||' from '||table_name||';' from (
    SELECT table_name,
    SUBSTR(SYS_CONNECT_BY_PATH(column_name, '||;||'),8) column_name
    FROM
    (SELECT table_name,column_name,

    COUNT(*) OVER ( partition BY table_name ) cnt,
    ROW_NUMBER () OVER ( partition BY table_name order by column_name) seq
    FROM user_tab_columns where table_name = '&tabelle'
    --WHERE COLUMN_ID IS NOT NULL
    )
    WHERE seq =cnt
    START WITH seq =1
    CONNECT BY prior seq+1=seq
    AND prior table_name =table_name);

    [/highlight]

    Nun brauch ich natürlich statt des Semikolons ';'
    Hatte es Über replace und escapen versucht, gelingt mir aber nicht.

    Hoffe jemand von Euch kann mir da weiter helfen.

    Vielen Dank schon mal

    Viele Grüesse

    Martin

  • #2
    Ich hab die Frage nicht genau verstanden, da es ein spool command in sqlplus gibt, der hier aber wohl nicht gemeint ist.
    Vielleicht änderst Du das SYS_CONNECT_BY_PATH in die Richtung, dann kommt wahrscheinlich ein lauffähiges select statement dabei raus, falls das gewünscht war.

    Code:
    SUBSTR(SYS_CONNECT_BY_PATH(column_name, ', '), 2)
    Gruß, defo

    Comment


    • #3
      Ab ORACLE 11g2 kann das, was ich hoffentlich als Anforderung richtig aus Deinem Script ablese ;-) deutlich vereinfacht werden:
      Code:
       SELECT  'SELECT '|| LISTAGG( column_name||', ') WITHIN GROUP (ORDER BY column_name) ||' FROM '||table_name||';'  zspool
          FROM  user_tab_columns 
         WHERE TABLE_NAME = '&tabelle'    
         GROUP BY TABLE_NAME;
      
      ZSPOOL                                                                          
      --------------------------------------------------------------------------------
      SELECT COl1, COL2, CLO3, ID FROM MY_TABLE;            
      1 row selected.

      Comment


      • #4
        Hallo Jum, hallo Defo,

        vielen Dank für Eure Hilfe. und entschuldigt meine späte Antwort. Hatte gestern frei

        Noch mal zum Sinn des ganzen.
        Der Optimalfall würde so aussehen.

        Per batch würde dem Script der Tabellenname übergeben und im Anschluss würde die Tabelle gespoolt.
        Die Überschrift ist kein Problem
        Beim eigentlichen Spool jedoch benötige ich im Spoolscript einen Delimiter in Hochkommata (||';'||).
        Mit den Hochkommata kommentiere ich natürlich wieder einiges aus.

        Kann natürlich gerne sein, dass ich einen völligen Denkfehler habe.

        Vielen Dank noch mal

        Viele Grüße

        Martin

        Comment


        • #5
          Also für mich ist ein Tabellen Spool die Ausgabe von Tabellendaten in eine Textdatei.
          Was Du wiederholt beschreibst, ist die Ausgabe eines Select Statements, nicht deren Inhalt.
          Welche der beiden Varianten möchtest Du umsetzen?
          Gruß, defo

          Comment


          • #6
            Dann vermutlich eher so:
            Code:
            SELECT LISTAGG( column_name,'||'';'' ||') WITHIN GROUP (ORDER BY column_name)  zspool
                FROM  user_tab_columns ctc
               WHERE TABLE_NAME = '&tabelle' 
               GROUP BY TABLE_NAME;
            
            ZSPOOL                                                                          
            --------------------------------------------------------------------------------
            SELECT COl1||';' ||COL2||';' ||CLO3||';' ||ID FROM MY_TABLE;            
            1 row selected.

            Comment


            • #7
              Hallo Defo,

              sorry, dass ich mich so umständlich ausgedrückt habe.
              Im Grunde hätte ich gerne beides mit dem Ergebnis einer Textdatei.
              Das select Statement soll nur ein Spoolscript genereieren.

              Originally posted by defo View Post
              Also für mich ist ein Tabellen Spool die Ausgabe von Tabellendaten in eine Textdatei.
              Was Du wiederholt beschreibst, ist die Ausgabe eines Select Statements, nicht deren Inhalt.
              Welche der beiden Varianten möchtest Du umsetzen?
              Viele Grüsse

              Martin

              Comment


              • #8
                Originally posted by jum View Post
                Dann vermutlich eher so:
                Code:
                SELECT LISTAGG( column_name,'||'';'' ||') WITHIN GROUP (ORDER BY column_name)  zspool
                    FROM  user_tab_columns ctc
                   WHERE TABLE_NAME = '&tabelle' 
                   GROUP BY TABLE_NAME;
                
                ZSPOOL                                                                          
                --------------------------------------------------------------------------------
                SELECT COl1||';' ||COL2||';' ||CLO3||';' ||ID FROM MY_TABLE;            
                1 row selected.


                Hallo Jum,

                das ist genau das was ich wollte.
                Tausend dank!

                Mit dem SYS_CONNECT_BY_PATH funtionierte es leider nicht, warum auch immer.

                Viele Grüße und Danke noch mal!

                Martin

                Comment


                • #9
                  Hallo nochmal,

                  funktioniert bestens. Mit den Parametern Tabellenname und Dateiname läuft alles automatisch.

                  Vielen Dank Euch Beiden!

                  Viele Grüße

                  Martin

                  Comment

                  Working...
                  X