【问题标题】:Postgres Stored Procedure from C#来自 C# 的 Postgres 存储过程
【发布时间】:2023-03-13 00:25:01
【问题描述】:

我有一个带有返回 JSON 文档的存储过程的 Postgres 数据库,基于此处的文章:http://www.sqlines.com/postgresql/npgsql_cs_result_sets

过程表示如下:

-- Procedure that returns a single result set (cursor)
CREATE OR REPLACE FUNCTION get_data_test() RETURNS refcursor AS $$
DECLARE
ref refcursor;              -- Declare a cursor variable
BEGIN
    OPEN ref FOR            -- Open a cursor
        SELECT row_to_json(r) AS data
        FROM 
        (
            SELECT *
            FROM data AS d
        ) r;
    RETURN ref;             -- Return the cursor to the caller
END;
$$ LANGUAGE plpgsql;

然后我从 .net 控制台应用程序运行以下代码:

// Making connection with Npgsql provider
using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
{
    conn.Open();

    var trans = conn.BeginTransaction();
    var cmd = new NpgsqlCommand("get_data_test", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Transaction = trans;

    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
            Trace.WriteLine(reader[0]);
    }
}

输出是具有引用名称的单个实例,而不是实际数据:

如果我直接在命令文本中运行选择查询,结果集将按预期返回。我也尝试过使用“SELECT get_data_test()”通过文本显式调用 proc,但这也仅因光标名称而失败。

我不相信我错过了一个步骤,并且这个 refcursor 应该不捆绑返回。我做错了什么?

【问题讨论】:

标签: c# .net postgresql stored-procedures


【解决方案1】:

碰巧,教程是错误的:

不错的 GitHub 错误报告:https://github.com/npgsql/npgsql/issues/1777

正确答案:

-- Procedure that returns a single result set (cursor)
CREATE OR REPLACE FUNCTION get_data_test() RETURNS TABLE (data JSON) AS $$
BEGIN
    RETURN query
        SELECT row_to_json(r) AS data
        FROM 
        (
            SELECT *
            FROM data AS d
        ) r;
END;
$$ LANGUAGE plpgsql;

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2012-06-02
    • 2016-09-07
    • 1970-01-01
    • 2012-12-31
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多