我编写了一个 Postgresql 函数来插入一行并返回从标识列生成的值。尝试从 C# 调用它时收到以下异常。
Npgsql.PostgresException:'42601:查询没有结果数据的目的地'
我环顾四周寻找答案,似乎 ExecuteScalar 对其他人有用,但在我见过的所有示例中,通常是在使用 RETURN QUERY 时,而不是局部变量。我错过了什么?
这是功能:
CREATE OR REPLACE FUNCTION public.func_insert_item(_name character varying)
RETURNS BIGINT
LANGUAGE plpgsql
AS $function$
DECLARE
_item_id BIGINT;
BEGIN
INSERT INTO public.items
(
name
)
VALUES
(
_name
)
RETURNING _item_id;
RETURN _item_id;
END;
$function$
这是C#:
static NpgsqlParameter CreateParameter(string name, ParameterDirection direction, string value)
{
var parameter = new NpgsqlParameter(name, NpgsqlTypes.NpgsqlDbType.Varchar, value.Length);
parameter.Direction = direction;
parameter.Value = value;
return parameter;
}
static void Main(string[] args)
{
using var connection = new NpgsqlConnection(connectionString.ToString());
connection.Open();
using var command = new NpgsqlCommand("func_insert_item", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(CreateParameter("_name", ParameterDirection.Input, name));
object itemId = command.ExecuteScalar();
}
看来您误解了该
RETURNING
条款。它应该列出语句应该返回的列,而不是返回值应该进入的变量的名称。后者需要一个附加INTO
条款。不幸的是,您没有提供表的 DDL,所以我不知道哪一列可能是您想要返回的 ID。替换
<name of the id column>
为它的名字。