I have a query that returns a lot of data into a CSV file. So much, in fact, that Excel can’t open it – there are too many rows. Is there a way to control spool to spool to a new file everytime 65000 rows have been processed? Ideally, I’d like to have my output in files named in sequence, such as large_data_1.csv, large_data_2.csv, large_data_3.csv, etc…
I could use dbms_output in a PL/SQL block to control how many rows are output, but then how would I switch files, as spool does not seem to be accessible from PL/SQL blocks?
(Oracle 10g)
UPDATE:
I don’t have access to the server, so writing files to the server would probably not work.
UPDATE 2:
Some of the fields contain free-form text, including linebreaks, so counting line breaks AFTER the file is written is not as easy as counting records WHILE the data is being returned…
Got a solution, don’t know why I didn’t think of this sooner…
The basic idea is that the master sqplplus script generates an intermediate script that will split the output to multiple files. Executing the intermediate script will execute multiple queries with different ranges imposed on
rownum, and spool to a different file for each query.