Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Aus Abfrage eine Email mit Excel Anhang

Dieses Thema im Forum "Oracle" wurde erstellt von chla1234, 16 Januar 2015.

  1. chla1234

    chla1234 Benutzer

    Hallo zusammen,

    ich bin neu hier und habe mich angemeldet, weil ich an einem Oracle Datenbankproblem nicht mehr weiterkomme:

    Ich habe eine Tabelle a. Und hierfür eine Abfrage:

    SELECT * FROM a WHERE a.spalte = 'Y'

    Ziel ist es nun, das Ergebnis dieser Abfrage als Excel Datei per Email an eine Person zu verschicken.
    Ich bin neu in der Datenbankprogrammierung und habe deswegen mein Problem allgemein formuliert - möchte ja was lernen und nicht nur Copy & Paste ;-)

    Doie englischsprachigen Dokumentationen, Blogs und Foren sind alle sehr ähnlich und helfen mir leider nicht weiter. Was ich schon mitbekommen habe ist, dass es von Oracle ein UTL_SMTP Packgage geben muss, das Emailversand mit Anhang erlaubt. Doch hier verstehe ich nur Bahnhof.

    Kann mir bitte jemand eine geeignete Vorgehensweiße für mein Problem nennen und die einzelnen Schritte erklären, die ich machen sollte? Oder vielleicht sogar ein geeignetes Beispiel mit Erklärungen geben?

    Besten Dank!

    Viele Grüße,
    chla 1234
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Dabei könnte dir MIME (Multipurpose Internet Mail Extensions) helfen.
    Funktioniert auch mit dem utl_smtp Package.

    Hier mal eine Prozedur die ich dafür aufgesetzt habe :)
    (Kann sämtliche Plaintext-Datentypen.... Als csv, txt, ini, xml, etc.)
    Code:
    Procedure send_mail
       (
          recipient Varchar2,
          subject   Varchar2,
          message   Varchar2,
          filename  Varchar2 Default Null,
          filetype  Varchar2 Default Null,
          data      Clob Default Null
       ) Is
          v_con         utl_smtp.connection;
          v_index       Number;
          v_clob_length Number;
     
          c_host          Constant Varchar2(15) := '10.1.10.45';
          c_domain        Constant Varchar2(15) := '10.1.10.45';
          c_sender        Constant Varchar2(100) := 'xxx@email.com';
          c_mime_boundary Constant Varchar2(20) := 'CONTENT-BLOCK';
          c_ending        Constant Varchar2(20) := 'MfG' || utl_tcp.crlf || 'ihre IT';
       Begin
          /* Instanzieren und Initialisieren der Verbindung + E-Mail */
          v_con := utl_smtp.open_connection(c_host);
          utl_smtp.helo(v_con, c_domain);
          utl_smtp.mail(v_con, c_sender);
          utl_smtp.rcpt(v_con, recipient);
          utl_smtp.open_data(v_con);
     
          /* Initialisieren des E-Mail Body */
          utl_smtp.write_data(v_con, 'From: ' || c_sender || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'To: ' || recipient || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'Subject: ' || subject || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'MIME-Version: 1.0' || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"');
     
          utl_smtp.write_data(v_con, utl_tcp.crlf);
     
          /* Übertragen des E-Mail Body */
          -- Neuer Block: message
          utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
     
          utl_smtp.write_data(v_con, message || utl_tcp.crlf);
     
          utl_smtp.write_data(v_con, utl_tcp.crlf);
          utl_smtp.write_data(v_con, utl_tcp.crlf);
     
          -- Neuer Block: attachment
          If filename Is Not Null And
             filetype Is Not Null And
             data Is Not Null
          Then
             utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
             utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
             utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
        
             v_clob_length := dbms_lob.getlength(data);
             v_index       := 1;
        
             While v_index <= v_clob_length
             Loop
                utl_smtp.write_data(v_con, dbms_lob.substr(data, 32000, v_index));
                v_index := v_index + 32000;
             End Loop;
          End If;
     
          -- Neuer Block: ending (Grußformel)
          utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
          utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
     
          utl_smtp.write_data(v_con, utl_tcp.crlf);
          utl_smtp.write_data(v_con, utl_tcp.crlf);
          utl_smtp.write_data(v_con, utl_tcp.crlf);
          utl_smtp.write_data(v_con, utl_tcp.crlf);
     
          utl_smtp.write_data(v_con, c_ending);
     
          /* Ende der Übertragung */
          utl_smtp.write_data(v_con, '--' || c_mime_boundary || '--');
     
          /* Ende der E-Mail + Verbindung */
          utl_smtp.close_data(v_con);
          utl_smtp.quit(v_con);
       End;
     
    Zuletzt von einem Moderator bearbeitet: 21 Januar 2015
    ukulele gefällt das.
  3. chla1234

    chla1234 Benutzer

    Hallo Distrilec,

    danke für deine Antwort. Leider verstehe ich deinen geposteten Code nicht vollständig. Wo kann ich in dem für das Attachment relevanten Code - Abschnitt

    Code:
    -- Neuer Block: attachment
          If filename Is Not Null And
             filetype Is Not Null And
             data Is Not Null
          Then
             utl_smtp.write_data(v_con, '--' || c_mime_boundary || utl_tcp.crlf);
             utl_smtp.write_data(v_con, 'Content-Type: text/plain' || utl_tcp.crlf);
             utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
        
             v_clob_length := dbms_lob.getlength(data);
             v_index       := 1;
        
             While v_index <= v_clob_length
             Loop
                utl_smtp.write_data(v_con, dbms_lob.substr(data, 32000, v_index));
                v_index := v_index + 32000;
             End Loop;
          End If;
    
    sagen, dass er das Ergebnis einer Abfrage als .csv beifügen soll?
     
  4. Distrilec

    Distrilec Datenbank-Guru

    Das sagst du hier:
    Code:
    utl_smtp.write_data(v_con, 'Content-Disposition: attachment; filename="' || filename || '.' || filetype || '"' || utl_tcp.crlf);
    Du sagst Die Content-Disposition ist attachment (Ein Anhang), der Dateiname is gleich der Variable "filename" plus ein Punkt plus die Variable "filetype".
    "filetype" ist in diesem Fall dann der Dateityp.

    Wie gesagt das funktioniert (mit meiner Prozedur) nur mit plaintext Datentypen wie z.B. csv (diese können dann mit Excel geöffnet werden).
     
  5. chla1234

    chla1234 Benutzer

    Okay, das habe ich verstanden!
    Aber wo soll ich nun den Inhalt meines Anhangs definieren? Also der Anhang ist ja nicht jedes Mal derselbe, sondern das Ergebnis einer Abfrage aus einer völlig anderen Tabelle....?
     
  6. Distrilec

    Distrilec Datenbank-Guru

    Weshalb gibt es wohl den Parameter "data" der als Clob deklariert wurde ? :)
    Code:
    declare
      Cursor dein_cursor is
         SELECT * FROM a WHERE a.spalte = 'Y';
    
      deine_csv_daten Clob;
    begin
       For rec_ In dein_cursor Loop
          deine_csv_daten := deine_csv_Daten || rec_.spalte1 || ';' || rec_.spalte2 || ';' || rec_.spalte3 || utl_tcp.crlf;
       End;
       dein_package.send_mail('dein_empfänger@muster.de', 'Dein Betreff', 'Das hier ist ein Test', 'datei_name', 'csv', deine_csv_daten);
    end;
     
  7. chla1234

    chla1234 Benutzer

    Schon mal vielen Dank. Ich probiere mich jetzt mal dran und melde mich, wenn ich das Problem hoffentlich gelöst habe :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden