我正在用c编写一个客户机,它向oracledb发送一个查询,当我尝试对受其影响的行数进行采样时,我总是得到值1。以下是查询:
char * query = "BEGIN "\
"INSERT INTO table_name ( field_1, field_2, id, field_3 ) VALUES ( :1, :2, :3, 1 );"\
"EXCEPTION "\
"when dup_val_on_index then "\
"UPDATE table_name SET field_1 =:4, field_2 =:5, field_3 = 1 where id = :6 and field_4 <= :7;"\
"END; ";
我使用 OCIStmtExecute
oci的功能 OCI_COMMIT_ON_SUCCESS
,为了对受影响的行进行采样:
ub4 update_count;
OCIAttrGet(stmthp, OCI_HTYPE_STMT, &update_count, 0, OCI_ATTR_ROW_COUNT, ctx->hp);
出于某种奇怪的原因,update\U count总是1。这很奇怪,因为如果我以同样的方式发送一个简单的update或insert查询,我会在update\u count中得到正确的结果。
在执行此表单中的查询时,是否有其他需要执行的操作?
1条答案
按热度按时间9bfwbjaz1#
不幸的是事情就是这样运作的。您的块可能正在删除20行,然后更新10行,等等。成功执行通过execute immediate运行的pl/sql块后,sql%rowcount始终返回1。您可以考虑在动态块内调用sql%rowcount,然后返回该值并使用它。
您可以在我的平凡的livesql脚本中看到这种行为:https://livesql.oracle.com/apex/livesql/s/kdh6dang21mt8eumn4x6wv0ct