replace

EGL replace 语句将已更改的记录放到文件或数据库中。

replace 语句的语法图
record name
I/O 对象的名称:带索引记录、相对记录或 SQL 记录。
with #sql{ sqlStatement }
显式 SQL UPDATE 语句。不要在 #sql 与左花括号之间留下任何空格。
from resultSetID
一个标识,它使 replace 语句与同一程序中之前运行的 getopen 语句相关。有关详细信息,请参阅 resultSetID
以下示例显示如何读取和替换文件记录:
  emp.empnum = 1;         // sets the key in record emp

  try
    get emp forUpdate;
  onException
    myErrorHandler(8);  // exits the program
  end

  
  emp.empname = emp.empname + " Smith";

  try
    replace emp;
  onException
    myErrorHandler(12);
  end

  

有关 replace 语句的详细信息取决于记录类型。有关 SQL 处理的详细信息,请参阅 SQL 记录

带索引记录或相对记录

如果要替换带索引记录或相对记录,则必须对该记录发出带有 forUpdate 选项的 get 语句,然后发出 replace 语句,在此之间不对同一个文件执行任何 I/O 操作。在调用 replace 语句之后,对同一文件执行的下一个 I/O 操作的作用如下所示:
  • 如果下一个 I/O 操作是对同一个 EGL 记录执行的 replace 语句,则在文件中更改该记录
  • 如果下一个 I/O 操作是对同一个 EGL 记录执行的 delete 语句,则在文件中对该记录设置删除标记
  • 如果下一个 I/O 操作是对同一文件中的记录执行的 get 语句,并包含 forUpdate 选项,则后续 replacedelete 语句对新读取的文件记录有效
  • 如果下一个 I/O 操作是对同一个 EGL 记录执行的 get 语句(不带 forUpdate 选项)或者是对同一个文件执行的 close 语句,则释放文件记录而不进行更改

有关 forUpdate 选项的详细信息,请参阅 get

SQL 记录

对于 SQL 处理,EGL replace 语句致使生成的代码包含 SQL UPDATE 语句。

必须通过两种方法中的任何一种来检索一行以进行后续替换:
  • 发出 get 语句(带有 forUpdate 选项)以检索该行;或者
  • 发出 open 语句来选择一组行,然后调用 get next 语句来检索所关心的行。

错误状态

当使用 replace 语句时,无效的情况包括:
  • 指定了不是 UPDATE 类型的 SQL 语句
  • 指定了 SQL UPDATE 语句的一些子句但不是所有子句
  • resultSetID 值是必需的时未指定该值;有关详细信息,请参阅 resultSetID
  • 指定了(或接受了)具有下列其中一个特征的 UPDATE 语句:
    • 更新多个表
    • 与不存在或者与相关主变量不兼容的列相关联
  • 使用了 SQL 记录作为 I/O 对象,并且所有记录项都是只读的
下列情况也会导致错误:
  • 定制了带有 forUpdate 选项的 EGL get 语句,但未指示特定 SQL 表列可用于更新;并且
  • get 语句相关的 replace 语句尝试修改该列。
可以通过下列任何一种方法来解决前述不匹配问题:
  • 定制 EGL get 语句时,在 SQL SELECT 语句的 FOR UPDATE OF 子句中包括列名;或者
  • 定制 EGL replace 语句时,在 SQL UPDATE 语句的 SET 子句中除去对该列的引用;或者
  • getreplace 语句接受缺省值。

隐式 SQL 语句

缺省情况下,写 SQL 记录的 replace 语句的作用如下所示:
  • 作为记录声明中的记录项与 SQL 表列相关联的结果,生成的代码将每个记录项中的数据复制到相关 SQL 表列中
  • 如果已将记录项定义为只读的,则与该记录项相对应的列中的值不受影响
缺省情况下,SQL 语句具有下列特征:
  • SQL UPDATE 语句不包含只读的记录项
  • 特定记录的 SQL UPDATE 语句类似于以下语句:
        UPDATE tableName
        SET column01 = :recordItem01,
            column02 = :recordItem02,
                     .
                     .
                     .
            columnNN = :recordItemNN    WHERE CURRENT OF cursor

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.