【发布时间】:2019-11-19 17:36:11
【问题描述】:
我是 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');
然后尝试从 refcursor 获取数据:
FETCH ALL FROM cur;
SQL 错误 [34000]:错误:游标“cur”不存在
尝试了另一种方法:
BEGIN;
SELECT proc_get_test('cur');
FETCH ALL FROM cur;
COMMIT;
输出:
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 行空值
谁能帮我在 plpgsql 和 c# 中调用该过程?
【问题讨论】:
-
你为什么要使用引用游标?一个简单的表函数会容易得多。
-
@JonathanWillcock 我昨天开始研究 postgres,我对此不太了解,所以我尝试像在 oracle 中那样使用 refcursor 获取数据。将尝试使用表功能
-
我猜这可能与Oracle有关!使用返回表的函数,这绝对容易得多。如果您需要示例代码,我可以很乐意提供一些。
-
@JonathanWillcock 我需要在过程中提及表列名称吗?我不能每次都这样做,因为我们有包含多列的大表
-
一般来说答案是肯定的。但这是一件好事。
SELECT * FROM是不好的做法。从长远来看,按名称和类型指定列将为您节省很多问题。
标签: c# postgresql plpgsql ref-cursor