具有多个受影响行的 RETURNING 子句

RETURNING clause with multiple affected rows

有没有办法使用 Npgsql 来使用准备好的 UPDATE 语句,该语句可以 return 从 RETURNING 子句中返回多个受影响的行?

当有一个受影响的行 returned 时,我已经能够通过将 RETURNING 参数标记为 Out 方向参数并从命令参数中获取它们的 returned 值来实现这一点,但这仅在有一个更新行时有效:

string sql = "UPDATE my_schema.jobs SET order_number=@order_number WHERE job_id = @job_id RETURNING job_id, order_number, created_time, state;"

var stmt = new NpgsqlCommand(sql, connection, transaction);

stmt.Parameters.Add("job_id", NpgsqlDbType.Bigint);
stmt.Parameters.Add("order_number", NpgsqlDbType.Varchar);

var outParam = new NpgsqlParameter("created_time", NpgsqlDbType.Bigint) { Direction = System.Data.ParameterDirection.Output };
stmt.Parameters.Add(outParam);

outParam = new NpgsqlParameter("state", NpgsqlDbType.Varchar) { Direction = System.Data.ParameterDirection.Output };
stmt.Parameters.Add(outParam);

await stmt.PrepareAsync(cancel);

...

stmt.Parameters["job_id"].Value = 10;
stmt.Parameters["order_number"].Value = "BT100";

int recordsAffected = await stmt.ExecuteNonQueryAsync(cancel);

if (recordsAffected != 0)
{
   long returnedJobId = stmt.Parameters["job_id"].Value as long;
   string returnedOrder = stmt.Parameters["order_number"].ToString();
   long returnedCreated = stmt.Parameters["created_time"].Value as long;
   string returnedState = stmt.Parameters["state"].ToString();
}

但是如果不止一行与 WHERE 子句匹配,PSQL 语句可以 return 来自 RETURNING 子句的多行。 NpgsqlCommand class 是否有任何方法可以通过非查询命令执行访问受更新影响的 returned 行集?

UPDATE ... RETURNING ... returns 一个常规结果集,其中的行数与数据库中更新的行数一样多。您可以像使用任何常规 SELECT 查询一样使用该结果集,使用 DbCommand.ExecuteReader().

OUT 参数仅适用于返回标量值(或固定数量的标量值)的情况,而不适用于任意数量的行(具有任意数量的列)的情况。

一般来说,OUT 参数对于 Npgsql/PostgreSQL 并不是很有用 - 无论您在何处考虑使用 OUT 参数,您都可以将输出作为常规结果集进行简单处理。 Read this section of the docs for more info..