Oracle使用存储过程返回结果集必须使用包,包包括包头和包体两部分,包头是定义部分包体是具体的实现
包头:
CREATE OR REPLACE
PACKAGE pkg_test_select_mul
AS
TYPE myrctype IS REF CURSOR;
PROCEDURE proc(s number, res OUT myrctype);
END pkg_test_select_mul;
这里定义了个一个游标和一个存储过程。
包体:
CREATE OR REPLACE
PACKAGE BODY "PKG_TEST_SELECT_MUL" AS
PROCEDURE proc(s in number,res OUT myrctype)
IS
BEGIN
OPEN res FOR Select emp_id,emp_Name, salary,birthday From emp where salary> s;
END proc;
END PKG_TEST_SELECT_MUL;
这里实现里包头中定义的存储过程,实现了查询工资超过一定数额的人的信息,而游标则不用重新定义了,且存储过程中的参数名必须和定义中的一致。下面我们看一下C#的调用部分。
OracleConnection conn = new OracleConnection(); //创建一个新连接
conn.ConnectionString = "Data Source='" + "MyTest" + "';user id='" + "azkaser" + "';password='" + "sti" + "';"; //写连接串
OracleCommand cmd = new OracleCommand("PKG_TEST_SELECT_MUL.proc", conn);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter p1 = new OracleParameter("s", OracleType.Number);
p1.Value = 4000;
p1.Direction = ParameterDirection.Input;
OracleParameter p2 = new OracleParameter("res", OracleType.Cursor);
p2.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
conn.Open();
OracleDataReader myReader = cmd.ExecuteReader();
while (myReader.Read())
{
MessageBox.Show(myReader.GetString(1));
}
conn.Close();
程序将得到的结果存放在OracleDataReader的对象中。
到此简单的Oracle存储过程操作就此就全部完成了,程序写的很随便,目的就是实现功能,将来有时间会进一步斟酌每个部分。