返回首页

gbase数据、南大通用产品文档:GBase8sBLOB 和 BYTE 数据类型的代码集转换

更新日期:2024年09月11日

当您使用 java.sql.PreparedStatement::setCharacterStream() 向 CLOB 列插入时,Java™
Unicode 字符会自动转换为数据库语言环境代码集。如果设置了环境变
量 IFX_CODESETLOB,则它的值确定是使用临时文件执行代码集转换还是在内存中执行
代码集转换。如果未设置 IFX_CODESETLOB ,则 LOBCACHE 环境变量确定在临时文
件中还是在内存中执行代码集转换。
但是,不鼓励您使用 java.sql.PreparedStatement::setCharacterStream() 来插入 BLOB 或
BYTE 列。JDBC 驱动程序不能将 Java 字符插入到数据库中,因此会尝试对字符进行行
代码集转换。
使用 java.sql.PreparedStatement::setBinaryStream() 是插入 BLOB 或 BYTE 列
的首选方式。

使用游标操作数据库资源,包括:执行SQL 语句、调用存储过程、执行事务、获
取结果集操作。
执行SQL 语句
连接创建后,可以使用连接的cursor 方法生成游标,然后可以使用游标执行SQL
语句和获取结果集。
执行单条语句
使用游标执行单条SQL 语句。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258}
try:
conn = connect()
conn.connect(**config)
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1276
执行多条语句
使用游标执行多条SQL 语句。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS test(id INT, name
VARCHAR(20))")
cur.execute("INSERT INTO test VALUES(%s,%s)", (1,'hello'))
获取结果集
当使用游标执行返回结果集的SQL语句后,可以使用游标的fetchone 方法获取结
果集中的一行数据、fetchmany 方法获取结果集中的多行数据、fetchall 方法获取结
果集中的所有数据。
获取一行数据
使用游标的fetchone 方法获取结果集中的一行数据。fetchone 接口可以循环调用,
直到结果集中的数据获取完毕。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1277
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE IF NOT EXISTS test(id INT, name
VARCHAR(50))")
cur.execute("INSERT INTO test VALUES(1,'hello'), (2,'world')")
cur.execute("SELECT * FROM test")
row = cur.fetchone()
while row is not None:
print row
row = cur.fetchone()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取多行数据
使用游标的fetchmany方法获取结果集中的多行数据。
fetchmany接口可以循环调用,
直到结果集中的数据获取完毕。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1278
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test")

row = cur.fetchmany(3)
while row:
print row
row = cur.fetchmany(4)

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取所有行数据
使用游标的fetchall 方法获取结果集中的所有行数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1279
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test")

print cur.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取多个结果集数据
当有多个结果集时,可使用如下方法获取多个结果集的数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1280
iters = cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST
LIMIT 10, 5", multi_stmt= True)
for ter in iters:
print ter.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取下一个结果集
当有多个结果集返回时,可以使用游标的nextset 方法跳过结果集后直接获取下一
个结果集的数据。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST LIMIT
10, 5;SELECT * FROM TEST LIMIT 15, 5", multi_stmt= True)

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1281
cur.nextset(2)
print cur.fetchall()

cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

注意
获取下一个结果集方法nextset 不能在遍历过程中使用,如下面的例子。
iters = cur.execute("SELECT * FROM test limit 5;SELECT * FROM TEST LIMIT
10, 5;SELECT * FROM TEST LIMIT 15, 5", multi_stmt= True)
for ter in iters:
cur.nextset()
print cur.fetchall()

执行存储过程
使用游标的callproc 方法可以调用GBase 数据库的存储过程。存储过程返回的结果
集通过错误!未找到引用源。小节中描述的方法获取。
如果存储过程包含输出参数,
则可以通过游标的save_param_val 方法获取输出参数
值。

下面的样例代码使用callproc 方法调用存储过程,并获取存储过程结果集。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1282
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
cur.execute("CREATE PROCEDURE TESTCALLPROC2() \
BEGIN \
select 3; \
select 4; \
END")
res = cur.callproc("TESTCALLPROC2")
for r in res:
print r.fetchall()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()

下面的样例代码使用callproc 方法调用存储过程,并通过save_param_val 方法
获取存储过程返回值。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC1")
cur.execute("CREATE PROCEDURE TESTCALLPROC1(\
IN pFac1 INT, IN pFac2 INT, OUT pProd INT) \
BEGIN \
SET pProd := pFac1 * pFac2; \
select 1; \

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1283
select 2; \
END")
res = cur.callproc("TESTCALLPROC1", (3,4,0))
for r in res:
print r.fetchall()
print cur.save_param_val()
cur.execute("DROP PROCEDURE IF EXISTS TESTCALLPROC2")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
执行事务
通过设置连接参数中的autocommit=False 参数,
即可控制事务,
可通过连接的commit
方法提交事务、rollback 方法回滚事务。

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1284
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test',
'autocommit':False,}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS test")
cur.execute("CREATE
TABLE
IF
NOT
EXISTS
test(id
INT,
val
VARCHAR(20))")
cur.execute("INSERT INTO test VALUES(1,'hello')")
conn.rollback()
cur.execute("INSERT INTO test VALUES(2,'world')")
conn.commit()
cur.execute("SELECT * FROM test")
print cur.fetchall()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
或者使用cur.execute("set autocommit=false")来开启一个事物。

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1285
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP PROCEDURE IF EXISTS test")
cur.execute("CREATE
TABLE
IF
NOT
EXISTS
test(id
INT,
val
VARCHAR(20))")
cur.execute("set autocommit=false")
cur.execute("INSERT INTO test VALUES(1,'hello')")
conn.rollback()
cur.execute("INSERT INTO test VALUES(2,'world')")
conn.commit()
cur.execute("SELECT * FROM test")
print cur.fetchall()
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
插入二进制数据
使用游标的execute 可以插入二进制数据内容。请参考下面的样例。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
fobj = open("c:\\1.gif",'rb')
fbytes = fobj.read()
fobj.close()

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1286
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS test(f blob)")
cur.execute("INSERT INTO test VALUES(_binary%s)",(fbytes,))
cur.execute("DROP TABLE IF EXISTS test")
cur.close()
except (GBaseError.DatabaseError, IOError), err:
print err
finally:
conn.close()
批量插入数据
当使用insert 语句插入数据时,通过调用游标的executemany 方法可以实现数据批
量插入。参见如下样例代码。
from GBaseConnector import connect, GBaseError
if __name__ == '__main__':
config = {'host':'172.16.0.131',
'user':'root',
'passwd':'111111',
'port':5258,
'db':'test'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS test")
cur.execute("CREATE TABLE test (COL1 INT, COL2 VARCHAR(20))")
opfmt = "INSERT INTO test(COL1, COL2) VALUES(%s, %s)"
rows = []
for i in xrange(0, 100):
rows.append((i, "row" + str(i)))
cur.executemany(opfmt, rows)
cur.execute("DROP TABLE IF EXISTS test")
except GBaseError.DatabaseError, err:
print err
finally:
conn.close()
获取加载返回信息
#!/bin/env python
from GBaseConnector import connect, GBaseError
connStr
=
{'host':'192.168.6.89','port':5258,
'user':'gbase','passwd':'gbase20110531',

GBase UP 产品手册 6 应用开发指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 1287
'database':'test', 'connection_timeout':9999999, 'charset':'utf8'}
conn = connect (**connStr)
cursor = conn.cursor()
cursor.execute("LOAD
GCLUSTER
DATA
INFILE
'ftp://gbase:gbase@192.168.6.94/rebalance_tmpdata/lineitem.tbl' into table t1 fields
terminated by '|';")
print cursor.info
print cursor.rowcount
cursor.close()
conn.close()

为便于理解以上概念,下表举例说明每种典型场景下查询和结果集,用例使用的建

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
463
表语句和数据为:
create table t (i1 int,
vc1 varchar(10) masked with (function='partial(2,"*****",0)'),
vc2 varchar(10) masked with (function='partial(2,"*****",0)'));
insert into t values (1, 'nblknabpa', 'pombkaia');
insert into t values (2, '.mapkna', '0jbadflk');
insert into t values ();

示例1:第i 类函数case when 脱敏列规则;
gbase>select case i1 when 1 then vc1 when 2 then '12345' else '67890' end as res from t;
+---------+
| res
|
+---------+
| nb***** |
| 12***** |
| 67***** |
+---------+

示例2:第i 类函数coalesce 脱敏列规则;
gbase>select coalesce(vc1,'12345') as res from t;
+---------+
| res
|
+---------+
| nb***** |
| .m***** |
| 12***** |
+---------+

示例3:第i 类函数case when 多脱敏列默认脱敏;
gbase> select case i1 when 1 then vc1 when 2 then vc2 else '67890' end as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+

示例4:第ii 类函数substring 默认脱敏;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
464
gbase> select substring(vc1, 1, 2) as res from t;
+------+
| res
|
+------+
| xx
|
| xx
|
| NULL |
+------+

示例5:第ii 类函数concat 默认脱敏;
gbase> select concat(vc1,'123') as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例6:第i 类函数嵌套使用;
gbase> select case when i1 > 1 then coalesce(vc1, '12345') else '67890' end as res from t;
+---------+
| res
|
+---------+
| 67***** |
| .m***** |
| 67***** |
+---------+

示例7:第ii 类函数嵌套使用;
gbase> select concat(substring(vc1,1,2),'123') as res from t;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例8:第i 类和ii 类函数混合嵌套调用;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
465
gbase> select coalesce(substring(vc1,1,2),'12345') as res from t;
(或者select substring(coalesce (vc1, '12345'), 1, 2) as res from t;)
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+

示例9:子查询内或外调用i 类;
gbase> select res from (select coalesce(vc1,'12345')as res from t) as tmp;
(或者select coalesce(vc1, '12345') as res from (select vc1 from t) as tmp;)
+---------+
| res
|
+---------+
| nb***** |
| .m***** |
| 12***** |
+---------+

示例10:子查询内或外调用ii 类;
gbase> select res from (select concat(vc1,'123') as res from t) as tmp;
(或者select concat (vc1, '123') as res from (select vc1 from t) as tmp;)
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例11:子查询内外调用i 类;
gbase> select case when i1 > 1 then res1 else '67890' end as res from (select i1,coalesce(vc1,
'12345') as res1 from t) as tmp;
+---------+
| res
|
+---------+
| 67***** |
| .m***** |
| 67***** |
+---------+

示例12:子查询内外调用ii 类;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
466
gbase> select concat(res1,'123') as res from (select substring(vc1,1,2) as res1 from t) as tmp;
+------+
| res
|
+------+
| xxxx |
| xxxx |
| NULL |
+------+

示例13:子查询内外混合调用i 类和ii 类。
gbase> select substring(res1,1,4) as res from (select coalesce(vc1, '12345') as res1 from t) as
tmp;
(或者
gbase> select coalesce(res1, '12345') as res from (select substring(vc1,1,2) as res1 from
t) as tmp; )
+------+
| res
|
+------+
| xxxx |
| xxxx |
| xxxx |
+------+
说明
脱敏列脱敏后如果超过脱敏列的最大长度,则自动截断为脱敏列的最大长度。
比如脱敏列定义为:
mask_col varchar(5) masked with (function ='partial(2,"xxxx",2)')
则值“abcde”理论上应脱敏为“abxxxxde”,脱敏后的长度超过了最大长度5,自动截断为
“abxxx”。
脱敏列脱敏后对于一些可设置长度的函数脱敏时也会被截断,比如:
select left(mask_col, 2) from t;
left 函数将使用默认脱敏,理论上应脱敏为“xxxx”,但超过了left 函数设置的最大长度,所
以自动截断为“xx”。
Union、Intersect 和Minus 运算时,对应列的脱敏规则与控制流函数的脱敏规则一致。
比如:
select mask_int_col from t union select mask_int_col as col from t;
将使用mask_int_col 的脱敏规则,而:
select mask_int_col from t union select mask_int_col+1 from t;

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
467
将使用默认脱敏。