文章 姚 鑫 · 三月 5, 2022 2m read

第七十二章 SQL函数 LAST_IDENTITY

第七十二章 SQL函数 LAST_IDENTITY

返回最后插入、更新、删除或读取的行的标识的标量函数。

大纲

LAST_IDENTITY()

描述

LAST_IDENTITY函数返回%ROWID局部变量值。在嵌入式SQLODBC中将%ROWID局部变量设置为一个值。动态SQL、SQL Shell或管理门户SQL界面未将%ROWID局部变量设置为值。动态SQL改为设置%ROWID对象属性。

LAST_IDENTITY函数不接受任何参数。请注意,参数括号是必需的。

LAST_IDENTITY返回受当前进程影响的最后一行的标识字段值。如果表没有标识字段,则返回受当前进程影响的最后一行的行ID(%ROWID)。返回值为数据类型INTEGER

  • 对于嵌入式SQL INSERTUPDATEDELETETRUNCATE TABLE语句,LAST_IDENTITY返回最后修改的行的IDENTITY%ROWID值。
  • 对于嵌入式SQL基于游标的SELECT语句,LAST_IDENTITY返回检索到的最后一行的IDENTITY%ROWID值。但是,如果基于游标的SELECT语句包括DISTINCT关键字或GROUP BY子句,则LAST_IDENTITY不会更改;它将返回其先前的值(如果有)。
  • 对于嵌入式SQL单行(非游标)SELECT语句,LAST_IDENTITY不会更改。返回先前的值(如果有)。

在进程启动时,LAST_IDENTITY返回NULL。在新的%RowID之后,LAST_IDENTITY返回NULL

如果没有行受操作影响,则LAST_IDENTITY不会更改;LAST_IDENTITY返回其先前的值(如果有)。在新的%RowID之后,调用LAST_IDENTITY返回NULL,但调用%ROWID会生<UNDEFINED>错误。

示例

以下示例使用两个嵌入式SQL程序返回LAST_IDENTITY。第一个示例创建一个新表Sample.Students,第二个示例使用数据填充该表,然后对数据执行基于游标的SELECT,并为每个操作返回LAST_IDENTITY

请按显示的顺序运行这两个嵌入式SQL程序。(这里有必要使用两个嵌入式SQL程序,因为除非引用的表已经存在,否则嵌入式SQL无法编译INSERT语句。)

/// d ##class(PHA.TEST.SQLCommand).LastIdentity()
ClassMethod LastIdentity()
{
	w !,"Creating table"
	&sql(
		CREATE TABLE Sample.Students 
		(
			StudentName VARCHAR(30),
			StudentAge INTEGER,
			StudentID IDENTITY
		)
	)
	if SQLCODE=0 {
		w !,"Created table, SQLCODE=",SQLCODE }
	elseif SQLCODE=-201 {
		w !,"Table already exists, SQLCODE=",SQLCODE }
}

ClassMethod LastIdentity1()
{
	w !,"填充表"
	n %ROWCOUNT,%ROWID
	&sql(
		INSERT INTO Sample.Students 
		(
			StudentName, StudentAge
		)
		SELECT Name,Age FROM Sample.Person WHERE Age <= '21'
	)
	if SQLCODE = 0 {
		w !,%ROWCOUNT," 已添加记录,最后一行ID为 ",%ROWID,! 
	} else {
		w !,"Insert failed, SQLCODE=",SQLCODE 
	}
	&sql(
		SELECT LAST_IDENTITY()
		INTO :insertID
		FROM Sample.Students
	)
	w !,"插入最后一个ID为: ",insertID,!!
	/* 基于游标的SELECT查询 */
	&sql(
		DECLARE C10 CURSOR FOR 
		SELECT StudentName INTO :name FROM  Sample.Students
		WHERE StudentAge = '17'
	)
	&sql(OPEN C10)
	q:(SQLCODE'=0)
	&sql(FETCH C10)
	while (SQLCODE = 0) {
		w name," is seventeen",!
		&sql(FETCH C10) 
	}
	&sql(CLOSE C10)
	w !,%ROWCOUNT," 查询的记录,最后一行ID为 ",%ROWID,!
	&sql(SELECT LAST_IDENTITY()
	INTO :qId)
	w !,"SELECT Last Identity is: ",qId,!
	&sql(DROP TABLE Sample.Students)
}
DHC-APP>d ##class(PHA.TEST.SQLCommand).LastIdentity1()
 
填充表
41 已添加记录,最后一行ID为 41
 
插入最后一个ID为: 41
 
Grabscheid,Jocelyn B. is seventeen
 
1 查询的记录,最后一行ID为 37
 
SELECT Last Identity is: 37