簡體   English   中英

如何從 c# 中的 plpgsql function 返回 refcursor?

[英]How to return refcursor from plpgsql function in c#?

我是 plpgsql 的菜鳥,我創建了一個存儲過程來將表數據放入 refcursor,我正在嘗試從 plpgsql 和 c# 調用該過程來檢查過程/c# 代碼是否工作正常。

程序:

CREATE OR REPLACE FUNCTION public.proc_get_test(out tbldata refcursor)
returns refcursor
LANGUAGE plpgsql
AS $function$
BEGIN
    open tbldata for
    select * from arc_mmstbrndgroup;
END;
$function$;

從 plpgsql 調用過程:

SELECT proc_get_test('cur');

Output:
調用過程

然后嘗試從 refcursor 獲取數據:

FETCH ALL FROM cur;

SQL 錯誤 [34000]: 錯誤: cursor "cur" 不存在

嘗試的另一種方法:

BEGIN;
SELECT proc_get_test('cur');
FETCH ALL FROM cur;
COMMIT;

Output:

輸出

C#:

var p = new PostgreSQLDynamicParameters();
p.Add("tbldata", dbType: NpgsqlDbType.Refcursor, direction: ParameterDirection.Output);

using (var multi = _connection.QueryMultiple("proc_get_test", param: p, commandType: CommandType.StoredProcedure))
{
    List<PostgresModel> dataMaster = multi.Read<PostgresModel>().AsList();

    return new ResponseModel { ResultSet = dataMaster, StatusCode = 1, StatusDescription = "Success" };
}

Api 也只接收 1 行 null 值

誰能幫我調用 plpgsql 和 c# 中的過程?

所以我嘗試在 plpgsql 中創建一個帶有多個引用的演示 function,如下所示:

CREATE OR REPLACE FUNCTION public.proc_get_multiple_cursors_test()
returns setof refcursor
LANGUAGE plpgsql
AS $$
DECLARE
    ref1 refcursor:= 'ref1';
    ref2 refcursor:= 'ref2';
BEGIN
    open ref1 for 
    select * from arc_mmstbrndgroup;
    return next ref1;

    open ref2 for 
    select * from arc_mmstbrndgroup;
    return next ref2;
END;
$$

並像這樣從 c# 調用這個 function :

_connection.Open();
NpgsqlTransaction trans = _connection.BeginTransaction();
using (var multi = _connection.QueryMultiple("proc_get_multiple_cursors_test", null, transaction: trans, commandType: CommandType.StoredProcedure))
{
    var result = multi.Read();
    var ref1 = _connection.QueryMultiple("FETCH ALL IN ref1", null, commandType: CommandType.Text, transaction: trans);
    List<PostgresModel> dataMaster = ref1.Read<PostgresModel>().AsList();
    var ref2 = _connection.QueryMultiple("FETCH ALL IN ref2", null, commandType: CommandType.Text, transaction: trans);
    List<PostgresModel> dataMaster2 = ref2.Read<PostgresModel>().AsList();
    trans.Commit();
    _connection.Close();

    return new ResponseModel
    {
        ResultSet = new
        {
            master1 = dataMaster,
            master2 = dataMaster2
        },
        StatusCode = 1,
        StatusDescription = "Success"
    };
}

現在它返回兩個游標的 output

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM