2016-03-27 26 views
0

Ich versuche, in Datei auf meinem Computer zu speichern, aber ich bekomme diesen Fehler für die Select-Anweisung.SQL-Befehl nicht ordnungsgemäß beendet? Wie verwende ich den Cursor in Oracle?

Hier ist der Code:

CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2) 
IS 
CURSOR cur IS SELECT * FROM tblname AS row_value; 
file UTL_FILE.FILE_TYPE; 
BEGIN 
    -- Open the file for writing 
file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767); 

-- Export rows one by one 
FOR rec IN cur LOOP 
    -- All columns were concatenated into single value in SELECT 
    UTL_FILE.PUT_LINE(file, rec.row_value); 
END LOOP; 

UTL_FILE.FCLOSE(file); 
    END; 
/

Ich möchte der Benutzer ein Verzeichnis, Dateinamen sowie die Tabelle, dass sie aus exportieren möchten. Auch wie verwende ich Zeile für Zeile Verarbeitung in Oracle 11g. Ich bin mir nicht sicher, ob ich es hier richtig mache

+0

Ein Problem ist in Zeile 3, 'tblname AS row_value;'. Das Schlüsselwort 'AS' wird nur in der SELECT-Klausel und nicht in der WHERE-Klausel unterstützt. Entfernen Sie 'AS' und es sollte funktionieren. –

+0

Ich habe die AS entfernt, aber ich bekomme die Tabelle nicht vorhanden und die Schleifenindexvariable 'REC' ist ungültig – user2127184

Antwort

0

Zuerst sollten Sie DIRECTORY Objekt verwenden, um Dateien zu schreiben. Weitere Informationen finden Sie unter this. Übergeben Sie den Namen des Verzeichnisses als Parameter.

CREATE DIRECTORY tmp_dir AS '<your path here>'; 

Der Benutzer muss auf das Verzeichnis priviledges haben

GRANT READ, WRITE ON DIRECTORY tmp_dir TO <use name>; 

Zweitens die Spaltendaten in einer einzigen Zeile String verketten (hier triviales Beispiel - Sie müssen eine erweiterte logik zB eine Kohlen Flucht Sonderzeichen.

Für eine Tabelle wie folgt

create table tab as 
select 'xxxxx' as col1, 'yyyy' as col2 from dual; 

können Sie

SELECT col1||','||col2 as row_value FROM tab; 

So verwenden, wenn Sie den Namen der Tabelle parametrisieren wird dies nur funktionieren, wenn alle Tabellen col1 und col2 enthalten - sonst werden Sie zusätzliche paramaters passieren müssen, um zu definieren, wie die row_value

bauen

CREATE OR REPLACE PROCEDURE export_cust(dir VARCHAR2, file_name VARCHAR2, tblname VARCHAR2) 
IS 
    TYPE TabCurTyp IS REF CURSOR; 
    cur TabCurTyp; 
    row_value varchar2(4000); 
    file UTL_FILE.FILE_TYPE; 
BEGIN 

file := UTL_FILE.FOPEN(UPPER(dir), file_name, 'w', 32767); 
OPEN cur FOR 'SELECT col1||'',''||col2 as row_value FROM '|| tblname; 
LOOP 
    FETCH cur INTO row_value; 
    EXIT WHEN cur%NOTFOUND; 
    UTL_FILE.PUT_LINE(file, row_value); 
    END LOOP; 

UTL_FILE.FCLOSE(file); 
END; 
/
:

Schließlich den Tabellennamen in einem Cursor Sie dynamic cursor Dies führt zu folgenden Verfahren müssen parametrisieren

Sie können auch nach vorhandenen CSV Exporter Skripten suchen.