一、Oracle Package的作用
1、定义与说明
a. 相关对象(自定义类型、函数、存储过程等)的封装
b. 程序包的各部分
- 程序包规格说明
声明子程序
- 程序包主体
定义子程序
2、使用程序包的优点
- 模块化
- 更轻松的应用程序设计
- 信息隐藏
- 新增功能
- 性能更佳
3、公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数
公有项 私有项
可以在程序包之外引用 不能在程序包之外引用
是在程序包规格说明中定义的 是在程序包主体中定义的
用于全局目的 用于局部目的
二、定义Package
用于定义Package中使用的自定义类型、函数、存储过程等...
示例:
CREATE OR REPLACE PACKAGE PKG_SYS_SEARCH is
--定义返回的游标
TYPE VLD_RESULT IS REF CURSOR;
--带返回类型为游标变量的存储过程
PROCEDURE GET_SEARCH_RESULT(SEARCH_CONDITION IN VARCHAR2,RETURN_VAL OUT VLD_RESULT);
END PKG_SYS_SEARCH;
三、完成Package Body
对Package中的自定义类型、函数、存储过程等对象的具体实现。
示例:
CREATE OR REPLACE PACKAGE BODY PKG_SYS_SEARCH
AS
PROCEDURE GET_SEARCH_RESULT(SEARCH_CONDITION IN VARCHAR2,RETURN_VAL OUT VLD_RESULT)
AS
BEGIN
--设置返回值
OPEN RETURN_VAL FOR
SELECT * FROM SYS_PARAM WHERE TYPE=SEARCH_CONDITION;
END;
END PKG_SYS_SEARCH;
注意:Package Body里面定义的GET_SEARCH_RESULT中参数名称必须与Package里面的GET_SEARCH_RESULT一致
四、Ado.net调用此过程
using System.Data.OracleClient
OracleConnection conn = new OracleConnection("Data Source=oracledb;User Id=UserID;Password=Password;");
// create the command for the stored procedure
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "PKG_SYS_SEARCH.GET_SEARCH_RESULT";
cmd.CommandType = CommandType.StoredProcedure;
// add the parameters for the stored procedure including the REF CURSOR
// to retrieve the result set
cmd.Parameters.Add("SEARCH_CONDITION", OracleType.VarChar).Value = "Aduit";
cmd.Parameters.Add("RETURN_VAL", OracleType.Cursor).Direction = ParameterDirection.Output;
// open the connection and create the DataReader
conn.Open();
OracleDataReader dr = cmd.ExecuteReader();
// 以DataReader返回
while(dr.Read())
{
for(int i = 0; i < dr.FieldCount; i++)
Console.Write(dr[i].ToString() + ";");
Console.WriteLine();
}
//以DataSet返回
System.Data.OracleClient.OracleDataAdapter da = new System.Data.OracleClient.OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "test");
conn.Close();