역시 Python 답게 아주 쉽습니다.
parameters 로 Dictionary를 전달할 경우에는 bind variable 이름과 값을 전달해 주면 되며,
parameters 로 List를 전달할 경우에는 bind variable의 순서대로 값을 전달해 주면 됩니다.
아래에 설명할 예제에 앞서 먼저 DB에 연결을 합니다.
import cx_Oracle
conn = cx_Oracle.connect('sys/orange@localhost:1521/orcl', mode = cx_Oracle.SYSDBA)
cursor = conn.cursor()
1. List를 이용한 bind variable 구현
>>> cursor.execute('SELECT * FROM SCOTT.EMP WHERE SAL >= :SAL AND DEPTNO = :DEPTNO' , [ 2000, 20 ]) <cx_Oracle.Cursor on <cx_Oracle.Connection to sys@localhost:1521/orcl>> >>> print(cursor.fetchall()) [(7566, 'JONES', 'MANAGER', 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20), (7788, 'SCOTT', 'ANALYST', 7566, datetime.datetime(1982, 12, 9, 0, 0), 3000.0, None, 20), (7902, 'FORD', 'ANALYST', 7566, datetime.datetime(1981, 12, 3, 0, 0), 3000.0, None, 20)] |
2. Dictionary를 이용한 bind variable 구현
>>> cursor.execute('SELECT * FROM SCOTT.EMP WHERE SAL >= :SAL AND DEPTNO = :DEPTNO' , { 'SAL' : 2000 , 'DEPTNO' : 20 }) >>> print(cursor.fetchall()) [(7566, 'JONES', 'MANAGER', 7839, datetime.datetime(1981, 4, 2, 0, 0), 2975.0, None, 20), (7788, 'SCOTT', 'ANALYST', 7566, datetime.datetime(1982, 12, 9, 0, 0), 3000.0, None, 20), (7902, 'FORD', 'ANALYST', 7566, datetime.datetime(1981, 12, 3, 0, 0), 3000.0, None, 20)] |
3. Bulk insert
cx_Oracle.Cursor.executemany( ) 함수를 이용하여 bulk insert 구현이 가능합니다.
하나의 statement에 bind variable을 List에 담아서 전달하면 됩니다.
각각의 row는 Tuple로 만들어서 List에 담습니다.
먼저 Test로 사용할 Table을 생성합니다.
CREATE_SCRIPT = """ CREATE TABLE SCOTT.TESTPY ( ID INT, NAME VARCHAR(32) ) """ cursor.execute(CREATE_SCRIPT)
Bind varialbe을 List로 생성합니다.
ARRAY = [] for i in range(0,10): ARRAY.append((i, 'TEST' + str(i)))
이제 bulk insert를 실행 후 결과를 확인해보겠습니다.
cursor.prepare('INSERT INTO SCOTT.TESTPY VALUES ( :1, :2 )') cursor.executemany(None, ARRAY) cursor.execute('SELECT * FROM SCOTT.TESTPY') >>> print(cursor.fetchall()) [(0, 'TEST0'), (1, 'TEST1'), (2, 'TEST2'), (3, 'TEST3'), (4, 'TEST4'), (5, 'TEST5'), (6, 'TEST6'), (7, 'TEST7'), (8, 'TEST8'), (9, 'TEST9')]
cx_Oracle.Cursor.executemany( )에 statement도 같이 전달하는 방법도 있습니다.
일단 값들을 삭제 한 후 시도해 보겠습니다.
>>> cursor.execute('DELETE SCOTT.TESTPY') >>> print(cursor.execute('SELECT * FROM SCOTT.TESTPY').fetchall()) [] >>> cursor.executemany('INSERT INTO SCOTT.TESTPY VALUES ( :1, :2 )', ARRAY) >>> print(cursor.execute('SELECT * FROM SCOTT.TESTPY').fetchall()) [(0, 'TEST0'), (1, 'TEST1'), (2, 'TEST2'), (3, 'TEST3'), (4, 'TEST4'), (5, 'TEST5'), (6, 'TEST6'), (7, 'TEST7'), (8, 'TEST8'), (9, 'TEST9')]
* 예제 Code
댓글 없음:
댓글 쓰기