그 결과 Connection Object를 생성하였습니다.
Connection Object에서 SQL문을 실행하기 위해서는 Cursor Object를 생성해야 합니다.
Connection.cursor() 함수를 실행하여 얻을 수 있습니다.
import cx_Oracle
conn = cx_Oracle.connect('sys/orange@localhost:1521/orcl', mode = cx_Oracle.SYSDBA)
cursor = conn.cursor()
순서상 Connection Object에 대한 설명이 먼저 와야 하지만, 기본적인 활용 단계에서는 자세히 살펴보지 않아도 됩니다.
Transaction을 제어, logon password 변경, shutdown database, cache size 변경 등의 작업을 할 경우에는 Connection Object에 대해서 아셔야 합니다만,
SQL 실행에 대해서는 몰라도 상관없습니다.
Connection Object에 대한 설명은 아래 Link에서 문서를 참조하시기 바랍니다.
http://cx-oracle.readthedocs.org/en/latest/connection.html
* Cursor Object
Connection Object 에서 cursor() 함수를 이용하여 선언이 가능합니다.
일반적으로는 1개의 cursor를 계속 해서 반복 사용하는게 보통입니다.
큰 project에서는 여러개의 cursor를 각각 선언하여 사용하기도 합니다.
cursor 별로 다른 query 결과를 담아두고 필요에 따라 fetch 하면서 사용하는 식의 process를 생각하시면 여러 cursor 의 필요성을 충분히 생각하실 수 있을 것입니다.
Cursor Object 의 기능 중 다음 3가지 가장 중요합니다.
일단 저정도만 알아도 Oracle에 대한 작업에는 큰 지장이 없습니다.
1. Parse
cx_Oracle.Cursor.parse([statement])
중요하다고 바로 위에서 얘기했지만, 솔직히 몰라도 상관없는 기능이긴 합니다.
통상적으로는 execute() 실행시 자동으로 parse 단계를 거치기 때문에 잘 사용되지 않습니다만,
실행전에 statement를 validate 할 용도로 사용 할 수 있습니다.
만약 statement에 error가 있다면
ORA-00900 : invalid SQL statement,
ORA-01301 : insufficient privileges
ORA-00921 : unexpected end of SQL command
등의 DatabaseError exception을 야기시킵니다.
2. Execute
cx_Oracle.Cursor.execute(statement, parameters)
statement 하나만 인자로 받은 경우에는 해당 statement를 실행합니다.
binding variable을 사용할 경우에는 parameters도 같이 입력을 해 주어야 합니다.
parameters 로 Dictionary를 전달할 경우에는 bind variable 이름과 값을 전달해 주면 되며,
parameters 로 List를 전달할 경우에는 bind variable의 순서대로 값을 전달해 주면 됩니다.
return 값이 있는 경우에는 List로 결과값들을 받습니다.
(binding variable 에 대해서는 다음 post에서 설명드리겠습니다.)
3. Fetch
Query 에서만 사용가능한 기능입니다. 왜냐면 DDL 과 DCL은 return 값이 없기 때문입니다.
cursor 가 query를 실행시키지 않은 경우에 사용하게 되면 InterfaceError exception 을 발생시킵니다.
cx_Oracle.Cursor.fetchall()
남아있는 모든 Row 들을 Tuple 들의 List로 return 합니다.
cx_Oracle.Cursor.fetchmany([rows_no])
인자로 전달한 수 만큼의 row를 return 합니다.
cx_Oracle.Cursor.fetchone()
하나의 row를 tuple로 return 합니다.
Cursor Object에 대해서 좀 더 자세히 알고 싶으시면 아래 Link를 참고하세요.
http://cx-oracle.readthedocs.org/en/latest/cursor.html
* 예제
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cx_Oracle | |
conn = cx_Oracle.connect('sys/orange@localhost:1521/orcl', mode = cx_Oracle.SYSDBA) | |
cursor = conn.cursor() | |
cursor.execute('SELECT * FROM SCOTT.EMP') | |
print(cursor.fetchone()) | |
print(cursor.fetchone()) | |
print(cursor.fetchmany(2)) | |
print(cursor.fetchall()) | |
cursor.execute('SELECT * FROM SCOTT.EMP') | |
for record in cursor: | |
print(record) | |
cursor.execute('CREATE TABLE SCOTT.TESTPY ( ID INT, NAME VARCHAR(32) )') | |
cursor.execute('INSERT INTO SCOTT.TESTPY VALUES ( 10, \'LUNA\')') | |
print(cursor.execute('SELECT * FROM SCOTT.TESTPY').fetchall()) | |
conn.rollback() | |
cursor.close() | |
conn.close() |
>>> print(cursor.fetchone()) (7369, 'SMITH', 'CLERK', 7902, datetime.datetime(1980, 12, 17, 0, 0), 800.0, None, 20) >>> print(cursor.fetchone()) (7499, 'ALLEN', 'SALESMAN', 7698, datetime.datetime(1981, 2, 20, 0, 0), 1600.0, 300.0, 30) >>> print(cursor.fetchmany(2)) [(7521, 'WARD', 'SALESMAN', 7698, datetime.datetime(1981, 2, 22, 0, 0), 1250.0, 500.0, 30), (7566, 'JONES', 'MANAGER', 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20)] >>> print(cursor.fetchall()) [(7654, 'MARTIN', 'SALESMAN', 7698, datetime.datetime(1981, 9, 28, 0, 0), 1250.0, 1400.0, 30), (7698, 'BLAKE', 'MANAGER', 7839, datetime.datetime(1981, 5, 1, 0, 0), 2850.0, None, 30), (7782, 'CLARK', 'MANAGER', 7839, datetime.datetime(1981, 6, 9, 0, 0), 2450.0, None, 10), (7788, 'SCOTT', 'ANALYST', 7566, datetime.datetime(1982, 12, 9, 0, 0), 3000.0, None, 20), (7839, 'KING', 'PRESIDENT', None, datetime.datetime(1981, 11, 17, 0, 0), 5000.0, None, 10), (7844, 'TURNER', 'SALESMAN', 7698, datetime.datetime(1981, 9, 8, 0, 0), 1500.0, 0.0, 30), (7876, 'ADAMS', 'CLERK', 7788, datetime.datetime(1983, 1, 12, 0, 0), 1100.0, None, 20), (7900, 'JAMES', 'CLERK', 7698, datetime.datetime(1981, 12, 3, 0, 0), 950.0, None, 30), (7902, 'FORD', 'ANALYST', 7566, datetime.datetime(1981, 12, 3, 0, 0), 3000.0, None, 20), (7934, 'MILLER', 'CLERK', 7782, datetime.datetime(1982, 1, 23, 0, 0), 1300.0, None, 10)] >>> for record in cursor: print(record) (7369, 'SMITH', 'CLERK', 7902, datetime.datetime(1980, 12, 17, 0, 0), 800.0, None, 20) (7499, 'ALLEN', 'SALESMAN', 7698, datetime.datetime(1981, 2, 20, 0, 0), 1600.0, 300.0, 30) (7521, 'WARD', 'SALESMAN', 7698, datetime.datetime(1981, 2, 22, 0, 0), 1250.0, 500.0, 30) (7566, 'JONES', 'MANAGER', 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20) (7654, 'MARTIN', 'SALESMAN', 7698, datetime.datetime(1981, 9, 28, 0, 0), 1250.0, 1400.0, 30) (7698, 'BLAKE', 'MANAGER', 7839, datetime.datetime(1981, 5, 1, 0, 0), 2850.0, None, 30) (7782, 'CLARK', 'MANAGER', 7839, datetime.datetime(1981, 6, 9, 0, 0), 2450.0, None, 10) (7788, 'SCOTT', 'ANALYST', 7566, datetime.datetime(1982, 12, 9, 0, 0), 3000.0, None, 20) (7839, 'KING', 'PRESIDENT', None, datetime.datetime(1981, 11, 17, 0, 0), 5000.0, None, 10) (7844, 'TURNER', 'SALESMAN', 7698, datetime.datetime(1981, 9, 8, 0, 0), 1500.0, 0.0, 30) (7876, 'ADAMS', 'CLERK', 7788, datetime.datetime(1983, 1, 12, 0, 0), 1100.0, None, 20) (7900, 'JAMES', 'CLERK', 7698, datetime.datetime(1981, 12, 3, 0, 0), 950.0, None, 30) (7902, 'FORD', 'ANALYST', 7566, datetime.datetime(1981, 12, 3, 0, 0), 3000.0, None, 20) (7934, 'MILLER', 'CLERK', 7782, datetime.datetime(1982, 1, 23, 0, 0), 1300.0, None, 10) >>> print(cursor.execute('SELECT * FROM SCOTT.TESTPY').fetchall()) [(10, 'LUNA')] |
댓글 없음:
댓글 쓰기