十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成
专业从事做网站、网站建设,高端网站制作设计,成都小程序开发,网站推广的成都做网站的公司。优秀技术团队竭力真诚服务,采用html5+CSS3前端渲染技术,成都响应式网站建设公司,让网站在手机、平板、PC、微信下都能呈现。建站过程建立专项小组,与您实时在线互动,随时提供解决方案,畅聊想法和感受。
1.创建包
--创建一个包sp_package
create package sp_package is
--声明该包有一个过程和函数,(没有实现)
procedure update_sal(name varchar2,newsal number);
function annual_nicome(name varchar2) return number;
end;
--创建包体(用于实现已经声明的函数和过程)
create package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
BEGIN
UPDATE emp
SET sal = newsal
WHERE ename = name;
END;
function annual_income(name varchar2)
return number is
annual_salary number;
BEGIN
SELECT sal * 12 + Nvl(comm,0)
INTO annual_salary
FROM emp
WHERE ename = name;
RETURN annual_salary;
END;
end;
--调用包中的内容
exec sp_package.update_sal('name',number);
25、包
(1)定义包头
语法:
CREATE [OR REPLACE] PACKAGE [schame_name.]包名
IS | AS
包描述
包描述:可以是变量、常量及数据类型定义和游标定义,也可以是存储过程、函数定义和参数列表返回值类型。
例:
CREATE OR REPLACE PACKAGE employeePackage
AS
--类型定义
Type empRecType is record(
Empno number(4),
Salary number
)
--变量定义
p1 varchar2(20);
type t_departmentNo table is table of dept.deptno%type
index by binary_integer;
--游标定义
Cursor order_sal retrurn EmpRecType;
--聘用员工过程
Procedure HireEmployee(p_EmpNo emp.empno%type);
End employeePackage;
例:
CREATE OR REPLACE PACKAGE scott.pkg_displayproduct
IS
procedure prc_getproductinfo
(
pid scott.product.prodid%type,
pname out scott.product.prodname%type,
ctname out scott.product.CATEGORYID%type,
dscp out scott.product.description%type
);
function fun_getstock
(
pid scott.product.prodid%type
)
return number;
END pkg_displayproduct;
(2)定义包体
语法:
CREATE OR REPLACE PACKAGE BODY [schame_name.]包名
IS | AS
包体描述;
END 包名;
包名:将要创建的包名称,该名称可以和包头所在的包名相同,也可以不同。
包体描述:游标、存储过程或者函数的定义
包体是可选的,如果在包头中没有声明任何存储过程或者函数,则包体就不存在,即使在包头有变量、游标或者类型的声明
(3)引用包中对象
BEGIN
[schame_name.][包名.]对象名;
END;
包只是作为 程序的一个载体而已,你要运行,当然是去调用它!
包里面可以包含函数、过程等,你可以开发程序时候调用包里面的这些程序!没有听说过包怎么运行的道理!
就像电视机(包)可以用来看电视,但是你不去打开它(调用包),它就没有作用!
楼下的明显误导别人啊,包何来参数之说?只有包里面的程序才有参数,调用包里面过程的方法如下:
begin
exec 包名.过程名();
end;
函数的调用就不用我写了吧!
先修改包头,加入存储过程声明,然后再在包体中增加即可!
select text from dba_source where owner='xxx' and name='包名' and type='PACKAGE BODY'
order by line asc
调用方式如下:
using (var conn = new OracleConnection(oradb))
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "PKG_NAME.INSERT_FUNC";
cmd.BindByName = true;
cmd.Parameters.Add("Return_Value", OracleDbType.Int16,
ParameterDirection.ReturnValue);
cmd.Parameters.Add("i_description", OracleDbType.Varchar2, 1000,
promotionEventSetupDetails.PromotionDescription,
ParameterDirection.Input);
cmd.Parameters.Add("i_theme", OracleDbType.Varchar2, 80,
promotionEventSetupDetails.PromotionTheme,
ParameterDirection.Input);
cmd.Parameters.Add("o_id", OracleDbType.Varchar2,
ParameterDirection.Output);
cmd.Parameters.Add("o_error_msg", OracleDbType.Varchar2,
ParameterDirection.Output);
conn.Open();
using (var dr = cmd.ExecuteReader())
{
// 业务代码
}
}
包头
create or replace package package_name is
prcedure p1;
prcedure p2(v1 in char, v2 in date);
end package_name;
包体
create or replace package body package_name is
prcedure p1 is
begin
--代码省略
end p1;
prcedure p2(v1 in char, v2 in date) is
begin
--代码省略
end p2;
end package_name;