使用了游标,返回列表,通过包定义类
SQLSERVER 中
做一个直接获得返回列表的存储
CREATE PROCEDURE [dbo].[test_get]
AS
SELECT RoleID, Description FROM test_tables ORDER BY Description ASC
测试存储过程
得到返回列表还有返回值
ORACLE中
但是如果是ORACLE数据库的PROCEDURE 是一般没有办法实现这个的,那么如何处理呢
ORACLE中并不直接返回记录集,记录集以游标的形式通过参数返回。
第一步 创建包 这个地方主要是定义了MYCRTYPE 一个游标类型
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;
END pkg_test;
第二步 创建函数
create or replace function mytest1(artno in number,p_cursor out pkg_test.myrctype)
return number is Result number;
begin
open p_cursor
for
select art_no,descr from article where art_no< artno;
return(Result);
end mytest1;
测试结果如图:
如图所示
所以 在C#代码中调用的时候和SQLSERVER的调用 返回值就没有区别了
private static OracleCommand BuildIntCommand3(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
{
OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
command.Parameters.Add("p_cursor", OracleType.Cursor).Direction = ParameterDirection.Output;
command.Parameters.Add("ReturnValue", OracleType.Number).Direction = ParameterDirection.ReturnValue;
return command;
}
主要体现在 添加了2个返回参数 P_CURSOR 游标记录集 和 RETURNVALUE 返回值
public static void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleDataAdapter sqlDA = new OracleDataAdapter();
sqlDA.SelectCommand = BuildIntCommand3(connection, storedProcName, parameters);
sqlDA.Fill(dataSet, tableName);
connection.Close();
}
}
使用OracleDataAdapter填充数据集
public DataSet GetNoPermissionList1(int roleId)
{
DataSet permissions = new DataSet();
OracleParameter[] parameters = { new OracleParameter("RoleID", OracleType.VarChar, 4) };
parameters[0].Value = roleId;
DbHelperOra.RunProcedure("sp_acc_getnopermissionlist", parameters, permissions, "Permissions");
return permissions;
}
带上参数 调用存储过程
DataTable mytb1= myperm.GetNoPermissionList1(555).Tables[0];
GridView1.DataSource = mytb1;
GridView1.DataBind();
前台页面展现返回的 记录集