使用oci将pl/sql块发送到db总是返回行\u infected=1(oracle db)

pu3pd22g  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(289)

我正在用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中得到正确的结果。
在执行此表单中的查询时,是否有其他需要执行的操作?

9bfwbjaz

9bfwbjaz1#

不幸的是事情就是这样运作的。您的块可能正在删除20行,然后更新10行,等等。成功执行通过execute immediate运行的pl/sql块后,sql%rowcount始终返回1。您可以考虑在动态块内调用sql%rowcount,然后返回该值并使用它。
您可以在我的平凡的livesql脚本中看到这种行为:https://livesql.oracle.com/apex/livesql/s/kdh6dang21mt8eumn4x6wv0ct

begin 
   execute immediate 'begin null; end;'; 
   dbms_output.put_line ('count = ' || sql%rowcount); 
end;   
/

count = 1

相关问题