虚谷Python开发手册
📄字数 13.1K
👁️阅读量 加载中...
虚谷数据库 Python 驱动接口是为 Python2.7 及以上版本的应用提供数据库访问接口,该驱动基于Python Database API Specification v2.0协议编写。
一、开发环境搭建
XuguDB 提供两种方式获取 Python 驱动包:通过产品包或单独下载。
1.1 产品包获取
Python 驱动压缩包默认在虚谷数据库的产品包内,解压产品包后,Python 驱动路径为:Driver/python。不同操作系统和 CPU 架构的Python 驱动,需要通过不同的产品包获取。
1.2 单独获取
Python 驱动还提供在线下载链接,可获取最新试用版和稳定版本的Python驱动。
| 操作系统 | CPU | 下载地址 |
|---|---|---|
| Windows | x86, 64-bit | 下载 |
| Linux | x86, 64-bit | 下载 |
| Linux | ARM, 64-bit | 下载 |
提示
- Windows 版本建议在 Windows10 及以上系统使用。
- Linux 版本可以在所有对应的 CPU 架构的类 Unix 系统下运行。
- 如果有在其它系统上安装 Python 驱动的需求,请联系虚谷。
1.3 驱动安装
Windows安装
Windows二进制文件压缩包内容如下:
└── xgcondb
将解压文件中的 xgcondb 目录放置到项目启动文件同级目录中即可完成安装操作。
linux安装
linux 二进制文件压缩包内容如下:
├── libxugusql.so
└── xgcondb
将解压文件中的xgcondb目录放置到项目启动文件同级目录,将 libxugusql.so 文件放置到系统动态库文件读取目录下。
二、Python版本支持
虚谷 Python 驱动包支持如下版本:
- python2.7
- python3.4
- python3.6
- python3.7
- python3.8
- python3.9
- python3.10
- python3.11
提示
xgcondb 包内整合了所有支持的 Python 版本二进制文件,切换 Python 版本无需切换驱动包。
三、快速入门
以下使用交互式会话方式展示了虚谷 python 驱动基础功能与程序开发流程。
对象创建
创建连接对象与游标对象,连接对象为驱动连接数据库的类实例,游标对象为实际执行SQL的类实例。
Python
>>> import xgcondb
# 创建数据库连接对象
>>> conn = xgcondb.connect(host="127.0.0.1",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='UTF8')
# 创建游标对象
>>> cur = conn.cursor()执行语句
使用游标对象普通执行、传参执行和批量执行 SQL 语句。
Python
# 执行命令:创建一个新表
>>> cur.execute("CREATE TABLE test_python (id integer identity PRIMARY KEY, name varchar, age integer);")
# 传递参数执行命令
>>> cur.execute("INSERT INTO test_python (name, age) VALUES (?, ?)",('test1', 18))
# 批量传递参数执行命令
>>> cur.executemany("INSERT INTO test_python (name, age) VALUES (?, ?)",(('test2', 19),('test3', 20),('test4', 21)))
# 查询数据库获取数据
>>> cur.execute("SELECT * FROM test_python;")
>>> cur.fetchone()
(1, 'test1', 18)
>>> cur.fetchmany(5)
[(2, 'test2', 19), (3, 'test3', 20), (4, 'test4', 21)]关闭对象
连接对象与游标对象使用完毕后进行关闭操作。
Python
# 关游标与连接对象
>>> cur.close()
>>> conn.close()四、xgcondb包
4.1 方法
4.1.1 connect()
功能
创建connection类对象。
原型
Python
def connect(*args, **kwargs)参数
host : 数据库ip地址,ips功能使用逗号间隔ip,例如:host="ip1,ip2"。
port : 数据库端口。
database : 库名。
user : 登录使用的用户名。
password : 登录用户的密码。
charset : 客户端编码信息,python客户端编码默认为utf8。
usessl : 加密连接设置,字符串格式传输,传入 "true","on","yes" 表示创建加密连接,其余都为非加密连接。
其他数据库会话连接参数,直接使用数据库会话连接参数名传递参数。
返回值
返回connection对象。
示例
Python
# 基础连接创建
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8', usessl = "true")
# 配置数据库current_schema连接参数
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8',current_schema="TEST")4.1.2 version()
功能
返回驱动版本信息。
原型
Python
def version()参数
无参数。
返回值
字符串式版本信息。
示例
Python
print(xgcondb.versin())
'xgcondb V2.3.7'五、connection类
connection类封装了数据库会话,通过包函数connect()创建。
连接是线程安全的,可以在多个线程之间共享连接对象。
5.1 方法
5.1.1 cursor()
功能
创建游标对象,用于数据库操作执行。
原型
Python
connection.cursor()参数
无参数
返回值
cursor类对象。
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()5.1.2 begin()
功能
在连接上开启一个新事务。
原型
Python
connection.begin()参数
无参数
返回值
无返回值
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
conn.begin()5.1.3 commit()
功能
提交连接上的事务。
原型
Python
connection.commit()参数
无参数
返回值
无返回值
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
conn.execute("create table t_commit(id int,name varchar);")
conn.begin()
conn.execute("insert into t_commit values(1,'test');")
conn.commit()5.1.4 rollback()
功能
回滚连接上的事务。
原型
Python
connection.rollback()参数
无参数
返回值
无返回值
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
conn.execute("create table t_rollback(id int,name varchar);")
conn.begin()
conn.execute("insert into t_rollback values(1,'test');")
conn.rollback()5.1.5 autocommit()
功能
设置连接的自动提交属性。
原型
Python
connection.autocommit(bool autocommit)参数
- autocommit: 待设置的自动提交属性值
返回值
无返回值
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
# 设置连接为自动提交
conn.autocommit(True)
# 设置连接为非自动提交
conn.autocommit(False)5.1.6 ping()
功能
连接判活,并根据参数自动重连。
原型
Python
connection.autocommit([bool reconnect])参数
- reconnect:连接失活下,自动重连标志位。(可选,默认为False)
返回值
存活或重连成功返回True,失活返回False。
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
if conn.ping(True):
print("conn is alive")5.1.7 select_db()
功能
切换连接对象所连接的数据库。
原型
Python
connection.select_db(string db_name)参数
- db_name:连接切换的数据库名。
返回值
无返回值。
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
conn.select_db("TESTDB")5.1.8 close()
功能
关闭连接对象。
原型
Python
connection.close()参数
无参数。
返回值
无返回值。
示例
Python
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
conn.close()六、cursor 类
游标对象由connection.cursor()方法创建,它们在整个生命周期内都绑定到连接,所有命令都在连接所包裹的数据库会话的上下文中执行。
游标不是线程安全的:多线程应用程序可以从同一连接创建多个游标,并且应该使用单个线程中的每个游标。
6.1 方法
6.1.1 execute()
功能
执行数据库语句。
原型
Python
cursor.execute(sql[,parameters])参数
sql: 待执行的sql语句
parameters:绑定到sql中的参数,可以为基础类型,一维元组、列表、字典。(可选)
ps : 使用字典传参,需要使用冒号+参数名格式作为占位符,其他传参使用问号作为占位符。
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
# 执行无参数SQL
cur.execute("create table t_execute(id int,name varchar);")
# 参数为基础类型
cur.execute("insert into t_execute values(1,?)","test")
# 参数为一维元组
cur.execute("insert into t_execute values(2,?)",("test2",))
cur.execute("insert into t_execute values(?,?)",(3,"test3"))
# 参数为一维列表
cur.execute("insert into t_execute values(4,?)",["test4"])
cur.execute("insert into t_execute values(?,?)",[5,"test5"])
# 参数为一维字典
cur.execute("insert into t_execute values(:id,:name)",{"id":6,"name":"test6"})6.1.2 executemany()
功能
以prepare方式批量执行数据库语句。
原型
Python
cursor.executemany(sql,parameters)参数
sql: 待执行的sql语句
parameters:绑定到sql中的参数,可以为一维元组、列表、字典,二维元组、列表、字典。
ps : 使用字典传参,需要使用冒号+参数名格式作为占位符,其他传参使用问号作为占位符。
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("create table t_executemany(id int,name varchar);")
# 参数为一维元组
cur.executemany("insert into t_executemany values(1,?)",("test1",))
cur.executemany("insert into t_executemany values(?,?)",(2,"test2"))
# 参数为二维元组
cur.executemany("insert into t_executemany values(?,?)",((3,"test3"),(4,"test4")))
# 参数为一维列表
cur.executemany("insert into t_executemany values(5,?)",["test5"])
cur.executemany("insert into t_executemany values(?,?)",[6,"test6"])
# 参数为二维列表
cur.executemany("insert into t_executemany values(?,?)",[[7,"test7"],[8,"test8"]])
# 参数为一维字典
cur.executemany("insert into t_executemany values(:id,:name)",{"id":9,"name":"test9"})
# 参数为二维字典
cur.executemany("insert into t_executemany values(:id,:name)",{"param1":{"id":10,"name":"test10"},"parm2":{"id":11,"name":"test11"}})6.1.3 executebatch()
功能
以批量发送参数方式执行数据库语句。
原型
Python
cursor.executebatch(sql,parameters)参数
sql: 待执行的sql语句
parameters:绑定到sql中的参数,类型二维元组、列表,元素为单列参数的集合。
ps : 传参使用问号作为占位符。
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="127.0.0.1",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("create table t_executebatch(id int,name varchar);")
param_1 = [1,2,3,4,5]
param_2 = ["name1","name2","name3","name4","name5",]
cur.executebatch("insert into t_executebatch values(?,?)",[param_1,param_2])6.1.4 fetchone()
功能
提取查询结果集一行数据。
原型
Python
cursor.fetchone()参数
无参数。
返回值
查询结果集一行数据的元组对象。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1,'test1' from dual")
print(cur.fetchone())
# (1, 'test1')6.1.5 fetchmany()
功能
提取查询结果集多行数据,获取的行数有参数size决定,如果没有传入参数,则由cursor.arraysize属性决定(cursor.arraysize默认为1)。
原型
Python
cursor.fetchmany([size=cursor.arraysize])参数
- size: 获取的结果集行数。(可选)
返回值
查询结果集多行数据的二维集合对象,集合对象装的是结果集某一行数据的元组对象。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("create table t_fetchmany(id int,name varchar);")
cur.execute("insert into t_fetchmany values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_fetchmany")
# 通过size参数控制行数
print(cur.fetchmany(3))
# [(1, 'test1'), (2, 'test2'), (3, 'test3')]
# 通过修改cursor.arraysize 控制行数
cur.arraysize = 3
print(cur.fetchmany())
# [(4, 'test4'), (5, 'test5'), (6, 'test6')]6.1.6 fetchall()
功能
一次性提取结果集的所有数据。
原型
Python
cursor.fetchall()参数
无参数。
返回值
查询结果集所有数据的二维集合对象,集合对象装的是结果集某一行数据的元组对象。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("create table t_fetchall(id int,name varchar);")
cur.execute("insert into t_fetchall values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_fetchall")
print(cur.fetchall())
# [(1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6')]6.1.7 getResultcolname()
功能
在结果集存在的情况下:获取对应列号的列名。
原型
Python
cursor.getResultcolname(int colno)参数
- colno: 指定列号,列序号从1开始。
返回值
指定列的列名
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolname(1))
# COL16.1.8 getResultcolseq()
功能
在结果集存在的情况下:获取对应列名的列序号
原型
Python
getResultcolseq(string colname)参数
- colname:需要获取列序号的列名。
返回值
指定列名的列序号,从1开始。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolseq("COL1"))
# 16.1.9 getResultcolsize()
功能
在结果集存在的情况下:获取对应列号的精度。
原型
Python
cursor.getResultcolsize(int colno)参数
- colno: 指定列号,列序号从1开始。
返回值
指定列的精度。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolsize(1))
# 16.1.10 getResultcolscale()
功能
在结果集存在的情况下:获取对应列号的标度。
原型
Python
cursor.getResultcolscale(int colno)参数
- colno: 指定列号,列序号从1开始。
返回值
指定列的标度。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 as col1 from dual")
print(cur.getResultcolscale(1))
# 06.1.11 setinputsizes()
功能
事先设置传入执行方法的参数长度。
原型
Python
cursor.setinputsizes(sizes)参数
- sizes: 参数尺寸元组
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.close()
cur.setinputsizes((10,10));
cur.execute("select 1 from dual where ? = ?;",(10,10));6.1.12 setinputtype()
功能
事先设置传入执行方法的参数对应的数据库类型,不由驱动自动检测。
原型
Python
cursor.setinputtype(types)参数
- types: 参数类型元组
types元素的值为xugu规定的参数类型值。具体值与映射关系如下表:
| 虚谷数据库数据类型 | 对应参数类型 |
|---|---|
| NULL | XG_C_NULL |
| BOOLEAN | XG_C_BOOL |
| VARCHAR | XG_C_CHAR |
| TINYINT | XG_C_TINYINT |
| SMALLINT | XG_C_SHORT |
| INTEGER | XG_C_INTEGER |
| BIGINT | XG_C_BIGINT |
| DOUBLE | XG_C_DOUBLE |
| NUMERIC | XG_C_NUMERIC |
| DATE | XG_C_DATE |
| TIME | XG_C_TIME |
| DATETIME | XG_C_DATETIME |
| BINARY | XG_C_BINARY |
| INTERVAL_YEAR_TO_MONTH | XG_C_INTERVAL_YEAR_TO_MONTH |
| INTERVAL_DAY_TO_SECOND | XG_C_INTERVAL_DAY_TO_SECOND |
| CLOB | XG_C_CLOB |
| BLOB | XG_C_BLOB |
| SYS_REFCURSOR | XG_C_REFCUR |
| CHAR | XG_C_NCHAR |
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.close()
cur.setinputtype((XG_C_INTEGER,XG_C_INTEGER));
cur.execute("select 1 from dual where ? = ?;",(10,10));6.1.13 callproc()
功能
执行存储过程支持存储过程带参数(in、out、inout)、存储过程不带参数、存储过程返回结果集。
原型
Python
cursor.callproc(string procname[,parameters,parametertypes])参数
procname: 待执行存储过程名称
parameters:若存储过程需要传递参数,第二个参数应该为参数元组对象。
parametertypes:若存储过程需要传递参数,第三个参数应该为参数类型元组对象。
返回值
参数列表对象。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.close()
# 执行无参数存储过程
print(cur.callproc("test_no_parameter"))
# 执行有参数存储过程
print(cur.callproc("test_in",(20,),(1,)))
print(cur.callproc("test_out",("xugu",),(2,)))
print(cur.callproc("test_inout",(20,'xugu'),(3,2)))6.1.14 nextset()
功能
多结果集情况下,跳到下一结果集。
原型
Python
cursor.nextset()参数
无参数。
返回值
存在下一结果集返回True,不存在放回None。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 from dual;select 2 from dual;")
cur.nextset()
print(cur.fetchone())
# (2,)6.1.15 close()
功能
关闭游标对象。
原型
Python
cursor.close()参数
无参数。
返回值
无返回值。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.close()6.2 属性
6.2.1 description
功能
获取结果集的列的属性,用户执行 SQL 查询语句后,存在结果集则会返回结果集中每一列的属性,如果不存在结果集则会返回 None。
说明
description列属性按顺序分别存储:(列名,列类型,占位符暂无意义,占位符暂无意义,精度,标度,占位符暂无意义)
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1,'test1' from dual")
print(cur.description)
[('EXPR1', 'TINYINT', None, None, 1, 0, None), ('EXPR2', 'VARCHAR', None, None, 7, 0, None)]6.2.2 rowcount
功能
存储结果集行数,在执行完一句查询语句后,可以通过该属性确定结果集行数
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("select 1 from dual")
print(cur.rowcount)
# 16.2.3 arraysize
功能
指定fetchmany函数默认的提取行数,默认为1。
示例
Python
import xgcondb
conn = xgcondb.connect(host="192.168.2.216",port="5138",database="SYSTEM",user="SYSDBA", password="SYSDBA", charset='utf8')
cur = conn.cursor()
cur.execute("create table t_arraysize(id int,name varchar);")
cur.execute("insert into t_arraysize values(1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6')")
cur.execute("select * from t_arraysize")
cur.arraysize = 6
print(cur.fetchmany())
# [(1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6')]七、示例
7.1 连接数据库并执行SQL语句
Python
#!/usr/bin/python3
import xgcondb
conn = xgcondb.connect(host="127.0.0.1", port="5138", database="SYSTEM", user="SYSDBA", password="SYSDBA")
cur = conn.cursor()
try:
cur.execute("CREATE TABLE TAB_FETCHONE_TEST1(A INT, B INT, C VARCHAR, D DATETIME, E NUMBER(4,2))")
cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1001,2001,'XUGU1','2019-01-01',23.54);")
cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1002,2002,'XUGU2','2019-01-02',2.354);")
cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1003,2003,'XUGU3','2019-01-03',35.4);")
cur.execute("INSERT INTO TAB_FETCHONE_TEST1 VALUES(1004,2004,'XUGU4','2019-01-04',54.00);")
cur.execute("SELECT * FROM TAB_FETCHONE_TEST1;")
row = cur.fetchone()
while row is not None:
print(row)
row = cur.fetchone()
print()
cur.execute("SELECT * FROM TAB_FETCHONE_TEST1;")
row = cur.fetchone()
print(row)
print(cur.fetchone())
print(cur.fetchone())7.2 大对象的插入与导出
Python
#!/usr/bin/python3
import xgcondb
conn = xgcondb.connect(host="127.0.0.1", port="5138", database="SYSTEM", user="SYSDBA", password="SYSDBA")
## 创建连接的游标
cur = conn.cursor()
cur.execute('create table t_lob(B BLOB, C CLOB);')
#---------------------大对象插入--------------------
clob_fp = open("./clob_test.txt","r")
blob_fp = open("./blob_test.jpg","rb")
clob_buf = clob_fp.read()
blob_buf = blob_fp.read()
cur.execute('insert into t_lob values(?,?);',(blob_buf,clob_buf))
#---------------------大对象导出--------------------
cur.execute('select * from t_lob;')
row = cur.fetchone()
clob_fd = open("./clob_select.txt","w+")
blob_fd = open("./blob_select.jpg","wb+")
blob_fd.write(row[0])
clob_fd.write(row[1])
cur.close()
conn.close()7.3 存储过程或存储函数提取结果集
Python
#!/usr/local/bin/python3
import xgcondb
conn=xgcondb.connect(host="127.0.0.1",port="5138",database="PYTHON3",user="SYSDBA", password="SYSDBA");
cur=conn.cursor();
cur.execute('create table test(arg1 int, arg2 varchar);')
#---------------------存储过程提取结果集--------------------
cur.execute('''CREATE or replace procedure pro_test(col1 int,col2 OUT SYS_REFCURSOR) as \
declare \
par1 int; \
str2 varchar; \
begin \
par1:=col1; \
for i in 1..par1 loop \
str2:='insert into test values('||i||',''||par2||'');'; \
execute immediate str2; \
end loop; \
OPEN col2 FOR SELECT * FROM test; \
end;''');
cur.setinputtype((xgcondb.XG_C_INTEGER,xgcondb.XG_C_REFCUR))
cur.setinputsizes((4,10))
print(cur.callproc('pro_test',(100,'refcur'),(1,2)))
row = cur.fetchall()
for i in row:
print(i)
cur.clearsize()
cur.cleartype()
cur.execute('drop procedure pro_test;')
#---------------------存储函数提取结果集--------------------
cur.execute('''CREATE or replace function fun_test(col1 int,col2 OUT SYS_REFCURSOR) return varchar as \
declare \
par1 int; \
str2 varchar; \
begin \
par1:=col1; \
for i in 1..par1 loop \
str2:='insert into test values('||i||',''||par2||'');'; \
execute immediate str2; \
end loop; \
OPEN col2 FOR SELECT * FROM test; \
return str2; \
end;''');
cur.setinputtype((xgcondb.XG_C_INTEGER,xgcondb.XG_C_REFCUR,xgcondb.XG_C_CHAR))
cur.setinputsizes((4,10,200))
print(cur.callfunc('fun_test',(100,'refcur'),(1,2)))
row = cur.fetchall()
for i in row:
print(i)
cur.clearsize()
cur.close()
conn.close()八、常见问题&解决方法
8.1 ImportError: libxugusql.so: cannot open shared object file: No such file or directory
在 unix 系列操作系统中使用 XuguDB python 驱动时,需要将 libxugusql.so 放置到系统动态库文件读取目录下,一般为 /usr/lib64/ 或 /usr/lib/ 。
