一个完整的 package 应该有有包头 package 和 包体 package body 组成
创建语法:
Create or replace package pkg_name –创建包头
As
--定义包变量,procedure,function等;
--包变量可以做为全局变量, procedure,function 在包头中之定义,并不写具体过程
--包头名称要和包体名称一致
End [pkg_name];--pkg_name可有可无
Create or replace package body pkg_name
As
--定义包变量,procedure,function等;
-- procedure,function具体过程
--包头名称要和包体名称一致
End [pkg_name];--pkg_name可有可无
包的重载﹐在包的内部过程和函数可以重载﹐即﹐可以有一个以上的名称相同施加在不同的对象上。
重载的限制﹐下列情况不算载﹕
1﹐参数仅在名称或类型上不同﹐不算重载
rocedure overload_pro(var1 in varcha2)与
procedure overload_pro(var1 out varcha2)不重载
2﹐参数属于同一类族﹐不算重载
procedure overload_pro(var1 in varcha2)与
procedure overload_pro(var1 in char)步不算重载
3﹐仅返回值类型不同
procedure overload_pro(var1 in varcha2) return date与
procedure overload_pro(var1 in varcha2) return number不算重载
--包的应用
--例子1
-- 创建包体
CREATE OR REPLACE PACKAGE pkg_test
AS
v_var1 VARCHAR2(100);
PROCEDURE p_1(i_var1 IN VARCHAR2,o_rtn OUT VARCHAR2);
FUNCTION f_1(i_var1 IN VARCHAR2) RETURN VARCHAR2;
END pkg_test;
-- 创建包头
CREATE OR REPLACE PACKAGE BODY pkg_test
AS
v_var2 VARCHAR2(100);
PROCEDURE p_1(i_var1 IN VARCHAR2,o_rtn OUT VARCHAR2)
AS
BEGIN
o_rtn :=v_var1;
v_var2:='package procedure test';
dbms_output.put_line(i_var1);
END;
FUNCTION f_1(i_var1 IN VARCHAR2) RETURN VARCHAR2
AS
v_var3 VARCHAR2(100);
BEGIN
v_var3:='package function test';
dbms_output.put_line(i_var1);
RETURN v_var3;
END;
END ;
-- 调用
DECLARE
v_var1 VARCHAR2(100);
v_rtn VARCHAR2(100);
BEGIN
pkg_test.v_var1 := 'package var test';
v_var1 :='this is a package test';
pkg_test.p_1(v_var1,v_rtn);
dbms_output.put_line('v_rtn='||v_rtn);
v_var1 :='this is a package function test';
v_rtn := pkg_test.f_1(v_var1);
dbms_output.put_line(v_rtn);
END ;
--例子2
--创建包头
create or replace PACKAGE temp_package
as
procedure update_emp_m(vemp_no in emp_m.emp_no%type,vemp_name in emp_m.emp_name%type);
procedure update_emp_m(vemp_no in emp_m.emp_no%type,vemp_name in emp_m.emp_name%type,vemp_sex in emp_m.emp_sex%type);
end temp_package;
--创建包体
create or replace PACKAGE body temp_package
as
procedure update_emp_m(vemp_no in emp_m.emp_no%type,vemp_name in emp_m.emp_name%type)
is
begin
update emp_m set emp_name=vemp_name where emp_no=vemp_no;
end update_emp_m;
--重载
procedure update_emp_m(vemp_no in emp_m.emp_no%type,vemp_name in emp_m.emp_name%type,vemp_sex in emp_m.emp_sex%type)
is
begin
update emp_m set emp_name=vemp_name,emp_sex=vemp_sex where emp_no=vemp_no;
end update_emp_m;
end temp_package;
--执行包
begin
temp_package.update_emp_m('0001','yongjie');
end;
begin
temp_package.update_emp_m('0001','yongjie.li','1');
end;
SELECT * FROM emp_m
--或者
begin
temp_package.update_emp_m('0001','lyjdb');
temp_package.update_emp_m('0001','yongjie.li','m');
end;
--向前声名(forward declarations)
--应用情况:函数(存储过程) A 调用函数(存储过程) B ,函数(存储过程) B 调用函数(存储过程) A
DECLARE
v_tempVal BINARY_INTEGER := 5;
-- forward decaration of procedure B
PROCEDURE B(p_counter IN OUT binary_integer);
PROCEDURE A(p_counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.put_line('A('||P_COUNTER||')');
IF p_counter > 0 THEN
B(p_counter);
p_counter := p_counter - 1;
END IF;
END A;
--
PROCEDURE B(p_counter IN OUT binary_integer) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('B('||P_COUNTER||')');
p_counter := p_counter - 1;
A(p_counter);
END B;
--
BEGIN
B(v_tempVal);
END;
--dbms_lock.sleep(秒);
--程序睡眠10再执行
DECLARE
BEGIN
dbms_output.put_line(to_char(SYSDATE,'yyyymmddhh24miss'));
dbms_lock.sleep(10);
dbms_output.put_line(to_char(SYSDATE,'yyyymmddhh24miss'));
END ;