在Oracle数据库中,你可以使用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
,并将其赋值给一个可以接受数组的绑定变量。
然而,根据StackOverflow上的一个回答,C#并不支持传递Oracle SQL集合数据类型,所以可能无法直接实现(原因未知,尽管在其他语言中可以做到这一点,但C#驱动程序不支持)。但是,C#支持PL/SQL关联数组,因此你或许可以先BULK COLLECT INTO
一个SQL集合,然后将其转换为PL/SQL关联数组并返回。
首先,在数据库内部创建一个定义了关联数组的包:
CREATE PACKAGE package_name AS
TYPE STRING_MAP IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
END;
/
接下来,你可以尝试使用类似这样的C#代码(由于我没有C#环境,这段代码未经测试,基于这个问题中的示例):
string cmd = @"
DECLARE
v_array package_name.STRING_MAP;
BEGIN
UPDATE MyTable
SET Status='A'
WHERE CaseId='123'
RETURNING DocId BULK COLLECT INTO v_array;
:UpdatedDocId := v_array;
END;";
DynamicParameters para = new DynamicParameters();
para.Add(
"UpdatedDocId",
direction: ParameterDirection.Output,
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
UdtTypeName = "PACKAGE_NAME.STRING_MAP"
);
await db.ExecuteAsync(cmd, para);
Oracle在线演示