Postgresql
呼叫從 C# 返回本地數字的 Postgresql 函式時出現異常
我編寫了一個 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
條款。CREATE OR REPLACE FUNCTION public.func_insert_item(_name character varying) RETURNS bigint LANGUAGE plpgsql AS $$ DECLARE _item_id bigint; BEGIN INSERT INTO public.items (name) VALUES (_name) RETURNING <name of the id column> INTO _item_id; RETURN _item_id; END; $$
不幸的是,您沒有提供表的 DDL,所以我不知道哪一列可能是您想要返回的 ID。替換
<name of the id column>
為它的名字。