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()