准备多个 SQL 语句

在 ESQL/C 中,您可执行几个 SQL 语句作为一个活动,如果您将它们包括在同一 PREPARE 语句中。将多语句文本作为一个单元处理;不是顺序地处理这些活动。因此,多语句文本不可包括那些依赖于该文本中先前的语句中发生的活动的语句。例如,您不可创建表并将值插入到同一准备好的语句块中的那个表内。

如果多语句准备中的一个语句返回错误,则停止执行这个准备好的语句。数据库服务器不执行任何余下的语句。在多数情况下,编译的产品返回关于错误的错误状态信息,但不指出文本中的哪一语句导致错误。您可使用 sqlca 中的 sqlca.sqlerrd[4] 字段来发现错误的偏移量。

在多语句准备中,如果在下列语句中从 WHERE 子句未返回行,则数据库服务器返回 SQLNOTFOUND (100)

在下一示例中,四个 SQL 语句被准备到称为 query 的单一 GBase 8s ESQL/C 字符串内。以分号分隔单独的语句。

单个 PREPARE 语句可准备该四个语句执行,且单个 EXECUTE 语句可执行与 qid 语句标识符相关联的语句:
sprintf (query,  "%s %s %s %s %s %s %s",
   "update account set balance = balance + ? ",
      "where acct_number = ?;",
   "update teller set balance = balance + ? ",
      "where teller_number = ?;",
   "update branch set balance = balance + ? ",
      "where branch_number = ?;",
   "insert into history values (?, ?);";
EXEC SQL prepare qid from :query;

EXEC SQL begin work;
EXEC SQL execute qid using
      :delta, :acct_number, :delta, :teller_number,
      :delta, :branch_number, :timestamp, :values;
EXEC SQL commit work;

此处需要分号(;)作为在 query 持有的文本中每一 SQL 语句之间的 SQL 语句结束符号