动态执行语句¶
当执行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。