动态执行语句

当执行DML操作时,可以使用executeUpdate()方法。类似地,当执行查询时,可以使用executeQuery()方法。

如果应用程序必须考虑动态事件的发生,并且不能确定在运行时必须执行哪条语句,那么ACCI提供execute()方法。调用execute()方法会返回以下状态之一:

  • UNPREPARED
  • PREPARED
  • RESULT_SET_AVAILABLE
  • UPDATE_COUNT_AVAILABLE
  • NEEDS_STREAM_DATA
  • STREAM_DATA_AVAILABLE

在调用execute()方法返回某个状态时,可以使用status()方法进一步“询问”该语句。

Statement* stmt = conn->createStatement();

Statement::Status status = stmt->status();       // 状态是UNPREPARED

stmt->setSQL("select * from emp");

status = stmt->status();                         // 状态是PREPARED

如果使用SQL字符串创建了statement对象,那么它将以PREPARED状态创建。例如:

Statement* stmt = conn->createStatement("insert into foo(id) values(99)");

Statement::Status status = stmt->status();// 状态是PREPARED

status = stmt->execute();               // 状态是 UPDATE_COUNT_AVAILABLE

在语句上设置另一条SQL语句时,状态更改为PREPARED。例如:

stmt->setSQL("select * from emp");       // 状态是 PREPARED

status = stmt->execute();                // 状态是RESULT_SET_AVAILABLE

下面讨论语句状态的定义

语句状态的定义

本节描述statement对象可能的状态值:

  • UNPREPARED
  • PREPARED
  • RESULT_SET_AVAILABLE
  • UPDATE_COUNT_AVAILABLE
  • NEEDS_STREAM_DATA
  • STREAM_DATA_AVAILABLE

UNPREPARED

如果没有使用setSQL()方法将SQL字符串设置为statement对象的属性,则该语句处于未准备(UNPREPARED)状态。

Statement* stmt = conn->createStatement();

Statement::Status status = stmt->status(); // 状态是 UNPREPARED

PREPARED

如果一个语句是用SQL字符串创建的,那么它是在准备状态创建的。例如:

stmt = conn->createStatement("INSERT INTO demo_tab(id) VALUES(99)");

Statement::Status status = stmt->status();    // 状态是 PREPARED

在该语句上设置另一条SQL语句会将状态更改为PREPARED。例如:

status = stmt->execute();                 // 状态是UPDATE_COUNT_AVAILABLE

stmt->setSQL("SELECT * FROM demo_tab");   // 状态是PREPARED

RESULT_SET_AVAILABLE

RESULT_SET_AVAILABLE的状态表示已经执行了一个格式正确的查询,并且可以通过结果集访问结果。

将statement对象设置为查询时,它是PREPARED 的。执行查询后,更改为RESULT_SET_AVAILABLE。例如:

stmt->setSQL("SELECT * from EMP");          // 状态是 PREPARED

status = stmt->execute();                   // 状态是RESULT_SET_AVAILABLE

要访问结果集中的数据,使用以下语句:

ResultSet *rs = Statement->getResultSet();

UPDATE_COUNT_AVAILABLE

当执行准备状态的DDL或DML语句时,其状态更改为UPDATE_COUNT_AVAILABLE,如下面的代码示例所示:

Statement* stmt = conn->createStatement("INSERT INTO demo_tab(id) VALUES(99)");

Statemnt::Status status = stmt->status(); // 状态是PREPARED

status = stmt->execute();                 // 状态是UPDATE_COUNT_AVAILABLE

此状态指的是statement执行影响了行数。这表明:

  • 该语句不包含任何输入或输出流。
  • 该语句不是查询,而是DDL或DML语句。

NEEDS_STREAM_DATA

当有输出流需要输入数据时,必须向待输入的输出流提供所有流数据才能完成执行。在这种情况下,状态更改为NEEDS_STREAM_DATA,以指示必须写入流。在写入流之后,调用status()方法来确定是否应该写入更多的流数据,或者执行是否已经完成。

一旦处理完所有流数据,状态将更改为RESULT_SET_AVAILABLE或UPDATE_COUNT_AVAILABLE。

STREAM_DATA_AVAILABLE

此状态表示在执行完成之前,应用程序需要读入一些流数据或读入/输出参数。在读取流之后,调用status方法来确定是否应该读取更多的流数据,或者执行是否已经完成。

处理完所有流数据后,状态更改为UPDATE_COUNT_REMOVE_AVAILABLE。