调用从C#代码返回SYS_REFCURSOR的Oracle PL / SQL函数

问题描述

ORACLE PL / sql函数返回类型为SYS_REFCURSOR的变量。函数代码如下

function get_list(
ain_page_number in number)
 return SYS_REFCURSOR
is
t_t_wk_req SYS_REFCURSOR;
begin

OPEN t_t_wk_req FOR
     SELECT
    numero            wk_req_id,cd_atividade      wk_req_act_cd,cd_componente     wk_req_asset_cd,cd_tipo           wk_req_maint_tp_cd,cd_mao            wk_req_maint_craft_cd,status_andamento  wk_req_status_andamento,obs               wk_req_des,row_number wk_req_row_number
FROM
    (
        SELECT
            ab.*,ROWNUM row_number
        FROM
            (
                SELECT
                    numero,cd_atividade,cd_componente,cd_tipo,cd_mao,status_andamento,obs
                FROM
                    emer_comp
                ORDER BY
                    numero DESC
            )ab
    )
WHERE
        row_number >((ain_page_number - 1)* 20)
    AND row_number <(ain_page_number * 20 + 1);


 return t_t_wk_req;
end get_list; 

以下代码用于将数据从数据库获取到C#

using (OracleConnection connection = (OracleConnection)_context.Database.Connection)
            {
                using (OracleCommand cmd = new OracleCommand($"wk_req_get_list.get_list",connection))
                {
                    connection.open();
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "BEGIN :t_t_wk_req := wk_req_get_list.get_list("+pageNumber+"); END;";
                    cmd.BindByName = true;
                    
                    OracleParameter param1 = new OracleParameter("ain_page_number",OracleDbType.Int32);
                    param1.Value = pageNumber;
                    param1.Direction = ParameterDirection.Input;
                    cmd.Parameters.Add(param1);

                    cmd.Parameters.Add("t_t_wk_req",OracleDbType.RefCursor,ParameterDirection.ReturnValue);

                    var dr = await cmd.ExecuteReaderAsync();
                    var result = new List<WorkRequestListModel>();
                    while (dr.Read())
                    {
                        var m = new WorkRequestListModel();
                        m.Number = Convert.ToInt32(dr.GetValue(0));
                        m.CdAtividade = dr.GetValue(1).ToString();
                        m.CdComponent = dr.GetValue(2).ToString();
                        m.CdTipo = dr.GetValue(3).ToString();
                        m.CdMao = dr.GetValue(4).ToString();
                        m.StatusAndamento = dr.GetValue(5).ToString();
                        m.Obs = dr.GetValue(6).ToString();
                        result.Add(m);
                    }
                    connection.Close();
                    return result;
                }
            }

C#代码关闭它打开的游标吗?

如果您发现您认为使用上述方法数据库将数据检索到C#代码的方式不合适的话,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)