2016-08-03 26 views
0

Wollen Ergebnisse in mehrere CSV-Dateien und Cutoff bei einer bestimmten Zeilennummer für jede Datei ausgeben. Ich habe Folgendes versucht, möchte aber nicht mehrere Abfragen erstellen.Orakel sqlplus Spool zu mehreren Dateien nach Zeilennummer

set colsep , 
DEFINE SPOOL_BASE_NAME = "spool" 
DEFINE PAGE_SIZE = 10 
DEFINE PAGE_NO = 1 
DEFINE SPOOL_EXT=".csv" 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT 

SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 

DEFINE PAGE_NO = 2 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO 
SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 
+2

Haben Sie verwenden müssen ' SQL * Plus' dafür? Es scheint viel einfacher zu sein, eine einzelne Datei aus 'SQL * Plus' zu erstellen und dann ein Stapel-Skript zu haben, das' SQL * Plus' aufruft und die Datei dann in kleinere Stücke aufteilt. Oder verwenden Sie 'utl_file', um die Dateien innerhalb einer Schleife zu generieren. –

+0

ich benutze Linux, wie würde diese Batch-Datei aussehen? – Dom

+0

Es kann so einfach sein wie 'split -l <> file_name' wobei' <> 'ist die Anzahl der Zeilen, die Sie pro Datei http://www.theunixschool.com/2012/10/10-examples-of-split wollen -command-in-unix.html –

Antwort

0

SQLPlus nicht das Konzept der Schleifen hat, aber Sie können einen SQLPlus Skript erstellen, die einen Parameter akzeptiert, so dass Sie ein Skript mit dem Kern-SQL haben könnte, sagen extract.sql, die wie folgt aussieht:

DEFINE SPOOL_BASE_NAME = "spool" 
DEFINE PAGE_SIZE = 10 
DEFINE PAGE_NO = &1 
DEFINE SPOOL_EXT=".csv" 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT 
SET TERM OFF 

SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 
EXIT 

Beachten Sie, dass, wenn Skripts von der Kommandozeile, SET TERM OFF läuft die Daten von Scrollen durch auf dem Bildschirm und gehört EXIT am Ende verhindert so SQLPlus für mehr Input warten rumhängen doens't.

Damit könnte man es von der Kommandozeile aufrufen als:

sqlplus username/[email protected] @extract.sql <pagenum> 

Das heißt:

sqlplus username/[email protected] @extract.sql 1 
sqlplus username/[email protected] @extract.sql 2 
sqlplus username/[email protected] @extract.sql 3 
... 

Der Bonus dafür ist, dass Sie ein paar von ihnen parallel in verschiedenen laufen kann Terminal/cmd Windows, damit man nicht auf den anderen warten muss.

Mit einer externen Schleife wie oben die Zahlen und rufen Sie das Skript zu generieren,

[Disclaimer:. Keine Garantien dies konsistente Ergebnisse erzeugen, wenn sie auf einem volatilen Quelle verwendet]