第七十二章 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