返回首页

gbase数据、南大通用产品文档:GBase8aLAST_INSERT_ID()

更新日期:2024年09月11日

功能描述
在insert 后,调用此函数可以获取刚插入的自增列值,一次插入多行时,此函数
只返回插入第一行产生的值。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1039
示例
gbase> CREATE TABLE t1(a INT AUTO_INCREMENT PRIMARY KEY,b
VARCHAR(100));
Query OK, 0 rows affected (Elapsed: 00:00:00.11)
gbase> insert into t1(b) values('b1');
Query OK, 1 row affected (Elapsed: 00:00:00.09)
gbase> insert into t1(b) values('b2');
Query OK, 1 row affected (Elapsed: 00:00:00.09)
gbase> select * from t1;
+---+------+
| a | b
|
+---+------+
| 2 | b1
|
| 4 | b2
|
+---+------+
2 rows in set (Elapsed: 00:00:00.02)
gbase> SELECT last_insert_id() from t1;
+------------------+
| last_insert_id() |
+------------------+
|
4 |
|
4 |
+------------------+

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1040
2 rows in set (Elapsed: 00:00:00.02)
gbase>
insert into t1(b) values('b3'),('b4');
Query OK, 2 rows affected (Elapsed: 00:00:00.05)
Records: 2
Duplicates: 0
Warnings: 0
gbase> select * from t1;
+----+------+
| a
| b
|
+----+------+
|
2 | b1
|
|
4 | b2
|
|
6 | b3
|
| 10 | b4
|
+----+------+
4 rows in set (Elapsed: 00:00:00.04)
gbase> SELECT last_insert_id() from t1;
+------------------+
| last_insert_id() |
+------------------+
|
6 |
|
6 |
|
6 |
|
6 |
+------------------+
4 rows in set (Elapsed: 00:00:00.02)

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1041
gbase> create table t2(a int auto_increment primary key,b varchar(100));
Query OK, 0 rows affected (Elapsed: 00:00:00.13)
gbase> insert into t2(b) values('a9');
Query OK, 1 row affected (Elapsed: 00:00:00.09)
gbase> SELECT last_insert_id() from t2;
+------------------+
| last_insert_id() |
+------------------+
|
2 |
+------------------+
1 row in set (Elapsed: 00:00:00.03)

对于特定于 GBase 8s 的给定错误编号,
rgetmsg() 函数检索错误消息文本。
rgetmsg()
函数可处理 short 错误编号,因此,可仅处理 -32768 - +32767 范围内的错误编号。为此,
请在所有新的 GBase 8s ESQL/C 代码中使用 rgetlmsg() 函数。

语法
mint rgetmsg(msgnum, msgstr, lenmsgstr)
mint msgnum;
char *msgstr;
mint lenmsgstr;
msgnum
错误编号。该二字节参数限制错误编号为 -32768 - +32767。
msgstr
指向接收消息字符串的缓冲区(输出缓冲区)的指针。
lenmsgstr
msgstr 输出缓冲区的大小。使得此值为您期望检索的最大消息的大小。

用法
通常,SQLCODE(sqlca.sqlcode)包含错误编号。您还可检索 ISAM 错误的消息文
本(在 sqlca.sqlerrd[1] 中)。对于错误消息文本,rgetmsg() 函数使用 GBase 8s 错误
消息文件
(在 $GBASEDBTDIR/msg 目录中)

如果该消息比您提供的缓冲区的大小更长,
则该函数截断消息来适应它。

重要: 为了与较早的版本相兼容,GBase 8s ESQL/C 支持 rgetmsg() 函数。有些
GBase 8s 错误编号当前超出 short 整数、msgnum 支持的范围。推荐支持 long 整数作
为错误编号的 rgetlmsg() 函数,而不是 rgetmsg()。

如果您的程序直接地传递 SQLCODE 变量中的值
(或 sqlca.sqlcode)
作为 msgnum,
则请强制转型 SQLCODE 值作为 short 数据类型。rgetmsg() 的 msgnum 参数有 short
数据类型,而 SQLCODE 值有 long 数据类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 882 -

返回代码
0
转换成功。
-1227
未找到消息文件。
-1228
在消息文件中未找到消息编号。
-1231
在消息文件内不可搜寻。
-1232
消息缓冲区太小。

示例

此程序在 demo 目录中的 rgetmsg.ec 文件中。
/*
* rgetmsg.ec *
*
* The following program demonstrates the usage of the rgetmsg() function.
* It displays an error message after trying to create a table that already exists.
*/
EXEC SQL include sqlca; /* this include is optional */

main()
{
char errmsg[400];

printf("\nRGETMSG Sample ESQL Program running.\n\n");
EXEC SQL connect to 'stores7';

EXEC SQL create table customer (name char(20));
if(SQLCODE != 0)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 883 -

{
rgetmsg((short)SQLCODE, errmsg, sizeof(errmsg));
printf("\nError %d: ", SQLCODE);
printf(errmsg, sqlca.sqlerrm);
}
printf("\nRGETMSG Sample Program over.\n\n");
}
输出
RGETMSG Sample ESQL Program running.
Error -310: Table (gbasedbt.customer) already exists in database.
RGETMSG Sample Program over.

Statement concurrency type is not set to CONCUR_UPDATABLE
试图为尚未使用 CONCUR_UPDATABLE 并发类型创建的语句调用 insertRow() 、
updateRow() 或 deleteRow() 方法。
用这个并发属性设置的类型重新创建语句。