文章
姚 鑫 · 三月 5 阅读大约需 2 分钟

第七十二章 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
0
0 9
讨论 (0)1
登录或注册以继续