设为首页 收藏本站
查看: 651|回复: 0

[经验分享] oracle学习笔记(第十二章:包)

[复制链接]

尚未签到

发表于 2016-8-8 07:39:29 | 显示全部楼层 |阅读模式
一个完整的 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;

包的辅助功能
--1共享缓冲区锁定:DBMS_SHAREDD_POOL
-- DBMS_SHAREDD_POOL允许把一个对象锁定在共享缓冲区中,当该对象被锁定以后,除非程序员申请对其清除
-- 否则不管共享缓冲区是否已满,或是否有程序访问 该对象,该对象将常驻在共享缓冲区中.这种方式有利于
-- 提高程序的运行效率.
-- DBMS_SHAREDD_POOL包有三个过程:DBMS_SHARED_POOL.KEEP,DBMS_SHARED_POOL.UNKEEP,DBMS_SHARED_POOL.SIZES
--DBMS_SHARED_POOL.KEEP过程语法:
PROCEDURE KEEP(NAME VARCHAR2,flag CHAR DEFAULT 'P');
-- 通过此过程可以锁定缓冲区中的对象,包,触发器,序列,和SQL语句都可以被锁定.但是独立的过程和函数不能锁定
-- 参数说明:
-- name:对象名称,可以是包名或是SQL语句相关联的标识符,SQL语句标识符是由试图$sqlarea中的字段hash_value
-- 和address连接组成
-- flag:决定对象的类型,如果是'P'则参数名name必须与包名相匹配,如果是'C'(光标),则nameN要带有sql语句的文本
-- 如果是'S',则name就是序列号,如果是'R',则name就是触发器
--DBMS_SHARED_POOL.UNKEEP过程语法:
PROCEDURE UNKEEP(NAME VARCHAR2,flag CHAR DEFAULT 'P');
-- 参数意义同KEEP过程
-- DBMS_SHARED_POOL.SZIES过程语法:
PROCEDURE SIZES(minsize NUMBER);

--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 ;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254702-1-1.html 上篇帖子: oracle学习笔记(第八章:游标) 下篇帖子: Oracle数据库基本操作步步详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表