.net 调用Oracle PL/SQL函数,该函数从C代码返回一个SYS\u REFCURSOR

.net 调用Oracle PL/SQL函数,该函数从C代码返回一个SYS\u REFCURSOR,.net,oracle,odp.net,.net,Oracle,Odp.net,ORACLE PL/SQL函数返回SYS\u 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_

ORACLE PL/SQL函数返回SYS\u 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代码的方式不合适,请告诉我。

使用OracleReader reader=cmd.ExecuteReader。。。。。。