执行SQL

ODBC API提供两种方式来执行SQL语句:

  • 直接执行
  • 准备执行

这两种方式可以执行单独一条SQL语句,也可以调用一个存储过程或者批量执行一组SQL语句。

直接执行

直接执行是最基本的执行语句的方式。应用程序先建立一个包含SQL语句的字符串,然后通过调用SQLExecDirect函数提交给神通数据库执行。 当语句达到服务器时,神通数据库先将它编译成执行计划然后立即执行该执行计划。

直接执行一般都是在应用程序需要在运行时构建并执行语句时使用,并且对于只是执行一次的语句来说,这种执行方式是最有效的。 而对许多数据库来说,这种执行方式也有一种弊端,就是SQL语句在每次执行是都需要先被分析编译一次,这样就在需要多次执行同一SQL语句的时候造成了服务器不必要的开销。

准备执行

当需要重复执行某一SQL语句时,ODBC API 认为准备执行是有效减轻数据库服务器分析编译负荷的执行方式。应用程序首先生成包含SQL语句的字符串,然后分两步来执行。 首先调用一次 SQLPrepare 函数,使SQL语句在数据库引擎中被分析编译成执行计划。 然后在每次需要执行时,调用 SQLExecute 来重复使用生成的执行计划。这样就在每次执行时减少了生成执行计划的开销。 因此,准备执行方式多数被应用在需要重复执行同一个SQL语句的场合。

对大多数数据库来说,在语句需要被重复执行3次以上时,准备执行方式比直接执行方式更快,这主要是因为语句在准备执行方式下只需要被编译一次,而在直接执行方式下语句每次执行前都需要先被编译。 准备执行方式也可以减轻网络传输的压力,因为在每次执行时驱动只需要向后台数据库传送执行计划名和参数值,而不是完整的SQL语句。

存储过程调用

存储过程是一种被编译好的可执行对象,每个存储过程一般包含了多个SQL语句。存储过程可以有输入和输出参数,也可以输出返回值。 应用程序可以调用Catalog函数来列出数据库内可用的存储过程。

使用神通数据库的ODBC应用程序可以通过直接执行和准备执行两种方式来调用存储过程。

ODBC应用程序在调用存储过程时应该使用ODBC的CALL语法,详细参考《过程调用》章节。

批量执行

批量执行的方式就是将多个SQL语句写入一个字串中,语句间通过分号 (;) 来分割,然后传递给 SQLExecDirect 来执行的方式。例如:

SQLExecDirect(hstmt, "SELECT * FROM TABLE1; SELECT * FROM TABLE", SQL_NTS);

批量执行方式比每次单独提交一条语句的执行方式更加有效,因为批量执行方式减少了网络流量。当处理完了当前的结果集,可以调用SQLMoreResult函数定位到下一个结果集上。

如果在神通数据库 ODBC数据源里配置了神通数据库 ODBC驱动使用服务器游标,则在批量执行时驱动仍然会使用本地游标,并且SQLExecDirect调用结束后返回SQL_SUCCESS_WITH_INFO。

神通数据库不支持批量SQL语句的准备执行,即不能将SQLPrepare和SQLExecute函数使用于批量执行方式。