返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

获取下一个结果集
当有多个结果集返回时,可以使用游标的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)

GBase Python 接口开发手册


- 12 -

南大通用数据技术股份有限公司
cur.execute("SELECT
*
FROM
test
limit
5;SELECT
*
FROM
TEST
LIMIT
10,
5;SELECT
* FROM TEST LIMIT 15, 5", multi_stmt= True)
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()

dectoasc() 函数将 decimal 类型数值转换为 C char 类型值。
语法
mint dectoasc(dec_val, strng_val, len, right)
dec_t *dec_val;
char *strng_val;
mint len;
mint right;
dec_val
指向 dectoasc() 将其值转换为文本字符串的 decimal 结构的指针。
strng_val
指向 dectoasc() 函数放置文本字符串所在的字符缓冲区的第一个字节的指针。
len
以字节计的 strng_val 的大小,对于空终止符,为负 1。
right
指示小数点右边小数位的数目的整数。

用法
如果 right = -1,dec_val 的小数确定小数位的数目。

如果 decimal 数目不适于长度 len 的字符串,则 dectoasc()() 将该数值转换为指数
表示方法。如果该数目仍不适合,则 dectoasc() 以星号填充该字符串。如果该数目比字符
串段,则 dectoasc() 左向调整该数值,并以空格补在右边。

由于 dectoasc()() 返回的字符串不是以空结尾的,因此,在您打印它之前,您的程序
必须将空字符添加到该字符串。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 658 -
返回代码
0
转换成功。
-1
转换失败。

示例

demo 目录中的文件 dectoasc.ec 包含下列样例程序。
/*
* dectoasc.ec *

The following program converts DECIMAL numbers to strings of varying sizes.
*/

#include

EXEC SQL include decimal;

#define END sizeof(result)

char string1[] = "-12345.038782";
char string2[] = "480";
char result[40];

main()
{
mint x;
dec_t num1, num2;

printf("DECTOASC Sample ESQL Program running.\n\n");


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 659 -
printf("String Decimal Value 1 = %s\n", string1);
if (x = deccvasc(string1, strlen(string1), &num1))
{
printf("Error %d in converting string1 to DECIMAL\n", x);
exit(1);
}
printf("String Decimal Value 2 = %s\n", string2);
if (x = deccvasc(string2, strlen(string2), &num2))
{
printf("Error %d in converting string2 to DECIMAL\n", x);
exit(1);
}

printf("\nConverting Decimal back to ASCII\n");
printf(" Executing: dectoasc(&num1, result, 5, -1)\n");
if (x = dectoasc(&num1, result, 5, -1))
printf("\tError %d in converting DECIMAL1 to string\n", x);
else
{
result[5] = '\0'; /* null terminate */
printf("\tResult ='%s'\n", result);
}

printf("Executing: dectoasc(&num1, result, 10, -1)\n");
if (x = dectoasc(&num1, result, 10, -1))
printf("Error %d in converting DECIMAL1 to string\n", x);
else
{
result[10] = '\0'; /* null terminate */
printf("\tResult = '%s'\n", result);
}

printf("Executing: dectoasc(&num2, result, END, 3)\n");

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 660 -
if (x = dectoasc(&num2, result, END, 3))
printf("\tError %d in converting DECIMAL2 to string\n", x);
else
{
result[END-1] = '\0'; /* null terminate */
printf("\tResult = '%s'\n", result);
}

printf("\nDECTOASC Sample Program over.\n\n")
}
输出

DECTOASC Sample ESQL Program running.

String Decimal Value 1 = -12345.038782
String Decimal Value 2 = 480

Converting Decimal back to ASCII
Executing: dectoasc(&num1, result, 5, -1)
Error -1 in converting decimal1 to string
Executing: dectoasc(&num1, result, 10, -1)
Result = '-12345.039'
Executing: dectoasc(&num2, result, END, 3)
Result = '480.000'
DECTOASC Sample Program over.

并发写入事务的潜在死锁情况
只要事务涉及多个表的或者同一个表相同行的更新时,
同时运行的事务就可能在同时尝
试写入时变为死锁状态。
事务会在提交或回滚时一次性解除其所有锁定,
而不会逐一放弃锁
定。例如,假设事务T1 和T2 在大致相同的时间开始:

如果T1 开始对表A 进行写入且T2 开始对表B 进行写入,则两个事务均可继续而不会
发生冲突;但是,
如果T1 完成了对表A 的写入操作并需要开始对表B 进行写入,
此时
操作的行数正好与T2 一致,它将无法继续,因为T2 仍保持对表B 对应行的锁定,此
时T2 开始更新表A 中与T1 相同的行数,此时也将无法继续,产生死锁,在锁等待超
时内,前面事务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛
错,有一个事务退出。

如果T1,T2 都对表A 进行写入,此时T1 更新1-5 行的数据,T2 更新6-10 行的数据,
两个事务不会发生冲突,但是,如果T1 完成后开始对表A 的6-10 行数据进行更新,
T2 完成后开始更新1-5 行的数据,此时两个事务无法继续,在锁等待超时内,前面事

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
333
务提交释放锁,后面的事务可以继续执行更新,等待时间超时后,事务抛错,有一个事
务退出。