I like wrapping database queries in stored procedures: it keeps the SQL in the database, where Oracle can track its dependencies and flag if some change makes it invalid. Here’s an example using Oracle’s demo schema SCOTT:
CREATE OR REPLACE PACKAGE emp_extract_k AS TYPE emp_t IS RECORD( ename varchar2( 10 ), hiredate date, sal number( 7, 2 ) ); TYPE emp_csr_t IS REF CURSOR RETURN emp_t; FUNCTION get_emps RETURN emp_csr_t; END; / CREATE OR REPLACE PACKAGE BODY emp_extract_k AS FUNCTION get_emps RETURN emp_csr_t IS c emp_csr_t; BEGIN OPEN c FOR SELECT ename, hiredate, sal FROM scott.emp; RETURN c; END; END;/
Now suppose I want to take the output from a stored procedure like the one above and write it to a CSV file. In Python this is trivially easy:
import cx_Oracle import csv reportName = 'emp_extract_k.get_emps' connection = cx_Oracle.connect(userid) cursor = connection.cursor() rs = cursor.callfunc(reportName, cx_Oracle.CURSOR) fd = open(reportName+'.csv', 'w') csvFile = csv.writer(fd) header = [] [header.append(col_defn[0]) for col_defn in rs.description] csvFile.writerow(header) for r in rs: csvFile.writerow(r) fd.close()