Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Importieren von Dateien in Oracle Apex mit wwv_flow_files

Angenommen, Sie möchten den Inhalt einer CSV-Datei mit einer benutzerdefinierten Datenbankprozedur in Oracle Apex mithilfe des Dateisuchseitenelements importieren. Befolgen Sie diese Schritte:Erstellen Sie in Apex ein Seitenelement zum Durchsuchen von Dateien und wählen Sie die Option wwv_flow_files zum Speichern der Datei. Erstellen Sie dann den Seitenprozess und wählen Sie nach dem Senden und Ausführen der Validierungsoption und der plsql-Codeoption für den Prozess aus. Schreiben Sie im plsql-Bereich den folgenden Code um eine csv-Datei aus der Datenbank (wwv_flow_files-Ansicht) auf das Serverlaufwerk zu exportieren und dann Ihre benutzerdefinierte Prozedur aufzurufen, um den Inhalt dieser Datei in eine Tabelle zu importieren. DECLARE
v_upl_blob BLOB;
vstart Number :=1;
bytelen Zahl :=32000;
len Zahl;
my_vr Raw (32000);
x Zahl;
l_output Utl_file.file_type;
erout varchar2(1000);
BEGIN
SELECT blob_content
INTO v_upl_blob
FROM wwv_flow_files
WHERE name =:P25_FB;
-- :p25_fb ist das Dateisuchelement auf Seite
LEN :=Dbms_lob.getlength(V_UPL_BLOB);
l_output :=Utl_File.fopen ('MY_FILES', :P25_FB, 'wb', 32760);
vstart :=1;
bytelen :=32000;
IF len <32760
Then
Utl_File.put_raw (l_output, V_UPL_BLOB);
Utl_File.fflush (l_output);
Sonst -- in Stücke schreiben
vstart :=1;

WHILE vstart 0
LOOP
Dbms_lob.Read (V_UPL_BLOB, bytelen, vstart, my_vr);
Utl_File.put_raw (l_output, my_vr);
Utl_File.fflush (l_output);
-- setze die Startposition für den nächsten Schnitt
vstart :=vstart + bytelen;
-- setze die Endposition, wenn weniger als 32000 Bytes
x :=x - bytelen;

IF x <32000
Then
bytelen :=x;
END IF;
END LOOP;
END IF;

Utl_File.fclose (l_output);

DELETE FROM wwv_flow_files
WHERE name =:P25_FB;
COMMIT;
--- Aufruf Ihrer benutzerdefinierten Datenbankprozedur zum Importieren...
Ihre benutzerdefinierte Prozedur(:P25_FB);
AUSNAHME When Others
Then
IF Utl_File.is_Open(l_output) Then
Utl_File.fclose (L_OUTPUT);
END IF;
raise;
END;