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