Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自C的Postgres存储过程#_C#_.net_Postgresql_Stored Procedures - Fatal编程技术网

C# 来自C的Postgres存储过程#

C# 来自C的Postgres存储过程#,c#,.net,postgresql,stored-procedures,C#,.net,Postgresql,Stored Procedures,我有一个Postgres数据库,其中包含一个返回JSON文档的存储过程,基于本文: 该过程如下所示: -- 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 OP

我有一个Postgres数据库,其中包含一个返回JSON文档的存储过程,基于本文:

该过程如下所示:

-- 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]);
    }
}
输出是具有refcursor名称的单个实例,而不是实际数据:

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


我不认为我遗漏了一个步骤,这个refcursor应该不绑定地返回。我做错了什么?

碰巧,教程错了:

尼斯GitHub错误报告:

正确答案:

-- 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;
可能重复的