Announcement

Collapse
No announcement yet.

ORDImage aus Datenbank holen

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

  • ORDImage aus Datenbank holen

    Hallo,
    ich habe ein Bild (ORDImage) in meine Oracle-Datenbank geladen. Jetzt würde ich dieses gerne wieder aus der Datenbank holen und lokal auf einem beliebigen Pfad auf dem PC speichern.

    Leider wüsste ich überhaupt keinen Ansatz, wie ich das realisieren soll. Habe noch nicht so viel Erfahrung im Umgang mit Oracle und habe auch relativ lange gebraucht, bis ich das Bild mal in die Datenbank bekommen habe. Nur als nächsten Schritt würde ich dieses gerne wieder auslesen.

    Vielen Dank für eure Antworten.

    Mit freundlichen Grüßen

    stash

  • #2
    Ist der beliebige Pfad für die Datenbank zugänglich oder soll das über's Netzwerk gehen?

    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
      Mit welchen Mitteln/Programmiersprache/umgebung hast du das geschaft? Jede Zugriffskomponente kann auf fast gleiche weise wie das Speichern von BLOB-Daten dies auch wieder auslesen.

      Comment


      • #4
        erstmal danke für die antworten.
        es wäre ein netzwerkpfad, auf den oracle aber zugreifen kann. dies wäre kein problem. diesen pfad habe ich ja auch benutzt, um ein Bild in die Datenbank zu laden.

        Die zweite Frage: Das Reinladen des Bildes habe ich mit Hilfe von PL/SQL gemacht. Nur weiß ich leider keinen Ansatz, wie ich dieses Bild wieder aus der Tabelle holen kann.

        MFG
        stash

        Comment


        • #5
          hier ein Ansatz zu PHP:
          http://www.knebler.de/Hilfe-PHP/Orac...P_nutzen_.php3

          Comment


          • #6
            erstmal danke für den link. allerdings sieht das ziemlich kompliziert aus. ist es wirklich so umständlich das Bild aus der Datenbank zu holen, oder liegt es daran, dass dieses dann auch gleich im Browser angezeigt werden soll?

            Gibt es nicht noch eine einfachere Variante. Will ja das Bild lediglich abspeichern auf der Festplatte. Visualisierung ist nicht notwendig.

            Danke

            mfg
            stash

            Comment


            • #7
              ist es wirklich so umständlich das Bild aus der Datenbank zu holen
              Nein, für deine Zwecke reichen ein paar Zeilen Quelltext. Ich hab das mal als anonymen PL/SQL Block geschrieben:

              Code:
              DECLARE
               l_image ORDImage;
               l_blob BLOB;
               l_fileHandle UTL_FILE.FILE_TYPE;
               l_buffer RAW(2000);
               l_amount BINARY_INTEGER:=2000;
               l_offset NUMBER:=1;
              BEGIN
                SELECT image INTO l_image FROM tblimages WHERE id=1; --Das Bild selektieren
                l_blob:=l_image.source.localData;                    --Aus dem Objekt den darin entahlatenen BLOB holen
                l_fileHandle:=UTL_FILE.FOPEN('DATEN',l_image.source.srcName,'wb'); --Die Datei im Binärmodus öffnen. Auf das Directory DATEN werden READ/WRITE Grants benötigt
               
                BEGIN
                  WHILE(TRUE) LOOP
                    DBMS_LOB.READ(l_blob,l_amount,l_offset,l_buffer);  --Jeweils 2000 Byte lesen und im Puffer zwischenspeichern
                    l_offset:=l_offset+l_amount;                       --Den Offset neu setzen
                    UTL_FILE.PUT_RAW(l_fileHandle,l_buffer);           --In die Datei schreiben
                  END LOOP;
                 
                  EXCEPTION
                    WHEN NO_DATA_FOUND THEN  --Ist der BLOB bis zum Ende gelesen, wird diese Exception geworfen
                      UTL_FILE.FCLOSE_ALL;   --Alle offenen Dateihandles schließen
                END;  
              END;
              /
              Den eingeschobenen BEGIN - END Block hab ich gemacht, damit ggf. eine NO_DATA_FOUND Exception des SELECT INTO nicht verschluckt wird. Kannst dir vorstellen wie einen try catch Block in Java.

              Dim
              Zuletzt editiert von dimitri; 19.11.2008, 22:14.
              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


              • #8
                hallo,
                vielen dank dimitri. das werd ich gleich dann mal ausprobieren.

                auch danke für die anderen antworten.

                mfg
                stash

                Comment


                • #9
                  hallo,
                  das beispiel von dimitri hat funktioniert. vielen dank nochmal.
                  jetzt würde ich aber gerne diesen code in eine for-schleife integrieren, damit nacheinander bilder ausgelesen werden. dies habe ich auch gemacht und das Programm läuft ohne Fehler durch.

                  Hab mich schon gefreut, dass dies so ohne weiteres funktioniert hat. allerdings habe ich mir dann die "Outputs" angeschaut. Leider hat er nur das erste Bild korrekt ausgelesen, die anderen haben entweder 0Byte Dateigröße oder können nicht angezeigt werden.

                  ich habe schon ein bisschen rumprobiert, aber ich wüsste nicht, was da schief gelaufen sein könnte.
                  die bilder sind ganz sicher korrekt und richtig in der Datenbank. Habe nämlich dann mal probehaft jedes Bild einzeln exportiert, dies hat ohne Probleme funktioniert.

                  danke für eure antworten.

                  mfg
                  stash

                  Comment


                  • #10
                    Poste doch mal den relevanten Code.

                    Dim

                    PS: ich vermute mal, Du hast die Variable l_offset nach einem Schleifendurchlauf nicht wieder auf 1 zurückgesetzt.
                    Zuletzt editiert von dimitri; 25.11.2008, 16:51.
                    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


                    • #11
                      ok, folgenden Code habe ich:
                      wie gesagt, ist im grunde genommen der code, den du schon weiter oben geschrieben hast lediglich mit einer for-schleife erweitert.

                      Code:
                      DECLARE
                       l_PIC ORDImage;
                       l_blob BLOB;
                       l_fileHandle UTL_FILE.FILE_TYPE;
                       l_buffer RAW(2000);
                       l_amount BINARY_INTEGER:=2000;
                       l_offset NUMBER:=1;
                      
                      for_counter integer;	
                      
                      	
                      BEGIN
                      
                      select count(*) into for_counter from PICTURES;
                      For i IN 1..for_counter
                      LOOP
                      
                        SELECT PIC INTO l_PIC FROM PICTURES WHERE id=i; 
                      		--Das Bild selektieren
                        
                        l_blob:=l_PIC.source.localData;                    
                      		--Aus dem Objekt den darin enthaltenen BLOB holen
                      
                        l_fileHandle:=UTL_FILE.FOPEN('IMG_OUTPUT',l_PIC.source.srcName,'wb'); 
                      --Die Datei im Binärmodus öffnen. Auf das Directory IMG_OUTPUT
                      --werden READ/WRITE Grants benötigt
                       
                        BEGIN
                          WHILE(TRUE) LOOP
                            DBMS_LOB.READ(l_blob,l_amount,l_offset,l_buffer);  
                      		--Jeweils 2000 Byte lesen und im Puffer zwischenspeichern
                            
                            l_offset:=l_offset+l_amount;                      
                      		 --Den Offset neu setzen
                            
                            UTL_FILE.PUT_RAW(l_fileHandle,l_buffer);           
                      		--In die Datei schreiben
                          END LOOP;
                         
                          EXCEPTION
                            WHEN NO_DATA_FOUND THEN  
                      		--Ist der BLOB bis zum Ende gelesen, wird diese Exception geworfen
                            
                              UTL_FILE.FCLOSE_ALL;   
                      		--Alle offenen Dateihandles schließen
                        END;  
                      
                      end loop;
                      END;
                      achso, noch eine Frage: was bedeutet eigentlich das 'wb' bei UTL_FILE.FOPEN

                      mfg
                      stash

                      Comment


                      • #12
                        Hi,

                        wie vermutet setzt Du die Variable l_offset nach einem Schleifendurchauf nicht wieder auf 1 zurück.
                        'wb' gibt an, dass die Datei im schreibenden binär Modus (write binary) geöffnet werden soll.

                        Des weiteren würde ich einen Cursor verwenden um über die Daten zu iterieren:
                        Code:
                        FOR i IN (select pic from pictures) LOOP
                         l_blob:=i.pic.source.localData;
                         ...
                         l_offset:=1;
                        END LOOP;
                        Damit kannst dir auch die counter Variable sparen und bekommst wirlich alle Bilder. Bei deiner Methode kannst ja ohne weiteres Lücken haben.
                        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


                        • #13
                          hallo,
                          vielen dank. funktioniert jetzt. allerdings dauert der export ziemlich lange.

                          habe dann einfach mal die anzahl der bytes erhöht, die auf einmal gelesen werden.

                          kann man dies ohne Probleme machen, oder wurde der wert 2000 bewusst von dir gewählt?

                          mfg
                          stash

                          Comment


                          • #14
                            Hi,

                            was bedeutet langsam? Um wieviele Bilder handelt es sich und von welchen Datenmengen reden wir?

                            RAW(2000) ist die maximale Länge im SQL Kontext. In PL/SQL kann sie aber bis zu 32767 Byte groß werden.

                            Du kannst den Puffer und die Variable l_amount (die angiebt wieviele Byte maximal gelesen werden) ja mal auf diesen maximalen Wert setzen.

                            Des weiteren ist hier der Link zur Doku, in der Du weitere Informationen über die von mir verwendeten packages findest.

                            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