Oracle 使用 Dapper 获取多个值作为输出参数

问题描述 投票:0回答:2

这是我的代码:

string cmd = "UPDATE MyTable SET Status='A' WHERE CaseId='123' RETURNING DocId INTO :UpdatedDocId";
DynamicParameters para = new DynamicParameters();
para.Add("UpdatedDocId", direction: ParameterDirection.Output, dbType: DbType.String, size: 50);
await db.ExecuteAsync(cmd, para);
var tempOutputValue = para.Get<dynamic>("UpdatedDocId");

如果只更新了一行,我可以正确获取更新后的 DocId 作为 tempOutputValue, 但如果更新了两行或更多行,我会收到如下错误: ORA-24369: 未为一个或多个绑定句柄注册所需的回调

有什么方法可以获取所有更新的 DocId 吗?

c# oracle dapper oracle.manageddataaccess
2个回答
0
投票

我不了解 Dapper,但是从 Oracle 的角度来看,一种选择是将受影响的 ID 返回到“集合”中。以下示例使用内置数据类型 sys.odcinumberlist(如果需要,您可以创建自己的数据类型)。参见第 7 行:

SQL> set serveroutput on;
SQL> declare
  2    l_col sys.odcinumberlist;
  3  begin
  4    update test set
  5      sal = sal + 100
  6      where deptno = 10
  7      returning empno bulk collect into l_col;        --> here
  8
  9    for i in 1 .. l_col.count loop
 10      dbms_output.put_line(l_col(i));
 11    end loop;
 12  end;
 13  /
7782              --> these IDs have been affected
7839
7934

PL/SQL procedure successfully completed.

SQL>

我希望您可以调整该代码,以便它可以在 Dapper 中使用。不幸的是,正如我所说,我不知道如何完成这部分工作。


0
投票
RETURNING column_name BULK COLLECT INTO collection_variable

如果您要在 PL/SQL 中实现它,将会是:

DECLARE TYPE docid_list IS TABLE OF MyTable.DocID%TYPE; v_UpdatedDocId docid_list; BEGIN UPDATE MyTable SET Status='A' WHERE CaseId='123' RETURNING DocId BULK COLLECT INTO v_UpdatedDocId; FOR i IN 1 .. v_UpdatedDocId.COUNT LOOP DBMS_OUTPUT.PUT_LINE(v_UpdatedDocId(i)); END LOOP; END; /

您需要将代码从 
INTO

更改为

BULK COLLECT INTO
并将其传递到可以接受数组的绑定变量中。
但是,C# 不支持传递 Oracle SQL 集合数据类型,因此可能无法实现(不知道为什么,您可以使用其他语言,但 C# 驱动程序不支持)。它确实支持 PL/SQL 关联数组,因此您可以 

BULK COLLECT INTO

SQL 集合,然后将 SQL 集合转换为 PL/SQL 关联数组并返回。

    

© www.soinside.com 2019 - 2024. All rights reserved.