cx_Oracle 是一个能够访问 Oracle 数据库的 Python 扩展模块。它符合 Python 数据库 API 2.0 规范,并增加了相当多的内容和几个排除项。Python 连接使用Oracle数据需要使用cx_Oracle 模块,本文主要介绍Python中安装使用cx_Oracle操作Oracle数据库。

1、安装cx_Oracle

Python中连接Oracle数据库,需要下载安装Oracle客户端驱动(Oracle Instant Client Basic),然后在安装cx_Oracle,如下,

pip install cx_Oracle

2、连接Oracle数据库

1)使用一个连接字符串

cx_Oracle.connect('admin/admin@192.168.31.11:1521/cjavapyXDB')

2)使用多个参数连接

cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB'')

注意:cjavapyXDBSERVICE_NAME,在tnsnames.ora文件中可以查看到。

3、Oracle数据库常用操作

1)查询数据

import cx_Oracle

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd='SELECT * FROM OrderInfo'
db_cursor.execute(sql_cmd)
for row in  db_cursor:
    print(row)

db_cursor.close()
db_conn.close()

#带参数查询
db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd='SELECT * FROM OrderInfo where ID = :id'
sql_p_id={'id':2}
db_cursor.execute(sql_cmd,sql_p_id)
for row in  db_cursor:
    print(row)

db_cursor.close()
db_conn.close()

#使用fetchone函数获取单行,使用fetchall函数获取多行
db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd='SELECT * FROM OrderInfo'
db_cursor.execute(sql_cmd)
#获取单行
print(db_cursor.fetchone())
#获取多行
#print(db_cursor.fetchall())
db_cursor.close()
db_conn.close()

2)插入数据

import cx_Oracle
from datetime import datetime

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd = 'INSERT INTO UserInfo(id, name, age,birth) VALUES(:id, :name, :age,:birth)'
#一次插入一条
db_cursor.execute(sql_cmd,(11,'levi',12,datetime(2019,9,2,9,30,12)))
db_cursor.execute(sql_cmd,(22,'lynn',12,datetime(2020,12,1,11,22,12)))
#一次插入多条
#db_cursor.executemany(sql_cmd, [(11,'levi',12,datetime(2019,9,2,9,30,12))), (22,'lynn',12,datetime(2020,12,1,11,22,12))])
db_conn.commit()
db_cursor.close()
db_conn.close()

3)删除数据

import cx_Oracle
from datetime import datetime

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd = 'DELETE FROM UserInfo WHERE id = :id '
db_cursor.execute(sql_cmd,{'id' : 11})
db_conn.commit()
db_cursor.close()
db_conn.close()

4)修改数据

import cx_Oracle
from datetime import datetime

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
sql_cmd = "UPDATE UserInfo SET name = 'John' WHERE id = :id"
db_cursor.execute(sql_cmd,{'id' : 12})
db_conn.commit()
db_cursor.close()
db_conn.close()

4、Oracle数据库调用存储过程和函数

1)创建存储过程

CREATE OR REPLACE PROCEDURE myproc(V1 IN VARCHAR2, V2 OUT VARCHAR2) IS
BEGIN
  V2 := V1;
END;

2)调用存储过程

import cx_Oracle

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
str='cjavapy'
msg =db_cursor.var(cx_Oracle.STRING)
db_cursor.callproc('myproc',[str,msg])
db_conn.commit()
print(msg)
print(msg.getvalue())
db_cursor.close()
db_conn.close()

3)创建函数

CREATE OR REPLACE function myfunc(V1 VARCHAR2,V2 VARCHAR2) RETURN VARCHAR2 
IS
BEGIN
  RETURN V1 || v2;
END;

4)调用函数

import cx_Oracle

db_conn = cx_Oracle.connect('admin', 'admin', '192.168.31.11:1521/cjavapyXDB')
db_cursor=db_conn.cursor()
str=db_cursor.callfunc('myfunc',cx_Oracle.STRING,['python','cjavapy'])
print(str)
db_conn.commit()
db_cursor.close()
db_conn.close()

推荐文档