Postgresql

呼叫從 C# 返回本地數字的 Postgresql 函式時出現異常

  • February 13, 2021

我編寫了一個 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>為它的名字。

引用自:https://dba.stackexchange.com/questions/285339