这是我的代码:
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 吗?
我不了解 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 中使用。不幸的是,正如我所说,我不知道如何完成这部分工作。
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 关联数组并返回。