C# 如何在没有存储过程的情况下获取更新的行主键

C# 如何在没有存储过程的情况下获取更新的行主键,c#,oracle,C#,Oracle,我需要在一个简单的update语句中检索更新行的主键。 我从Oracle中找到了“RETURNING INTO”子句,但是找不到一种方法来从使用C#更新的行中检索所有主键,而不创建存储过程。 逻辑非常简单,更新一些行,获取它们的ID,这样多个线程可以处理多组更新的行。 有可能实现吗?您不需要创建存储过程,但它不适用于简单的update语句。您至少需要这样的语句: DECLARE t_ids id_array; BEGIN UPDATE table SET field1 = :value WHER

我需要在一个简单的update语句中检索更新行的主键。 我从Oracle中找到了“RETURNING INTO”子句,但是找不到一种方法来从使用C#更新的行中检索所有主键,而不创建存储过程。 逻辑非常简单,更新一些行,获取它们的ID,这样多个线程可以处理多组更新的行。
有可能实现吗?

您不需要创建存储过程,但它不适用于简单的update语句。您至少需要这样的语句:

DECLARE t_ids id_array;
BEGIN
UPDATE table
SET field1 = :value
WHERE field2 = :searchFor
RETURNING key_column BULK COLLECT INTO t_ids;

OPEN :rcursor FOR SELECT * FROM TABLE(cast(t_ids as id_array));
END;
这将返回一个ref游标,您可以在c中处理它#

OracleCommand=newOracleCommand(“,连接);
command.BindByName=true;
//为update语句添加参数
// ...
//为ref游标添加out参数
OracleParameter refCursor=新的OracleParameter(“rcursor”,OracleDbType.refCursor);
refCursor.Direction=参数Direction.ReturnValue;
command.Parameters.Add(返回光标);
var reader=command.ExecuteReader();
OracleDataAdapter dataAdapter=新的OracleDataAdapter(命令);
DataTable dt=新的DataTable();
dataAdapter.Fill(dt);

你看了吗:谢谢Johannes,但我需要动态设置返回值,也就是说,我不知道将更新多少行。我想我在研究的过程中遇到了这个问题哈哈哈
OracleCommand command = new OracleCommand("<the sql query above>", connection);
command.BindByName = true;

// Add the parameters for update statement
// ...

// Add the out parameter for the ref cursor
OracleParameter refCursor = new OracleParameter("rcursor", OracleDbType.RefCursor);
refCursor.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(returnCursor);

var reader = command.ExecuteReader();

OracleDataAdapter dataAdapter = new OracleDataAdapter(command);
DataTable dt = new DataTable();
dataAdapter.Fill(dt);