文章目录


第七十二章 SQL函数 LAST_IDENTITY

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

大纲

LAST_IDENTITY()

描述

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

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

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

  • 对于嵌入式SQL​​INSERT​​​、​​UPDATE​​​、​​DELETE​​​或​​TRUNCATE 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