在 ESQL/C 中,您可执行几个 SQL 语句作为一个活动,如果您将它们包括在同一 PREPARE 语 句中。将多语句文本作为一个单元处理;不是顺序地处理这些活动。因此,多语句文本不可包括那 些依赖于该文本中先前的语句中发生的活动的语句。例如,您不可创建表并将值插入到同一准备好 的语句块中的那个表内。
如果多语句准备中的一个语句返回错误,则停止执行这个准备好的语句。数据库服务器不执行任何 余下的语句。在多数情况下,编译的产品返回关于错误的错误状态信息,但不指出文本中的哪一语 句导致错误。您可使用 sqlca 中的 sqlca.sqlerrd[4] 字段来发现错误的偏移量。
在多语句准备中,如果在下列语句中从 WHERE 子句未返回行,则数据库服务器返回 SQLNOTFOUND (100):
⚫ UPDATE … WHERE …
⚫ SELECT INTO TEMP … WHERE …
⚫ INSERT INTO … WHERE …
⚫ DELETE FROM … WHERE …
在下一示例中,四个 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 语句结束符号。




