博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pl/sql开发包
阅读量:4198 次
发布时间:2019-05-26

本文共 3738 字,大约阅读时间需要 12 分钟。

1、建立包

    包用于逻辑组合相关的PL/SQL类型、项和子程序,它由包规范和包体两部分组成。当建立包时,需要建立包

    规范,然后再建立包体。

(1)、建立包规范
 
 
 
 包规范实际是包与应用程序之间的接口,它用于定义包的公用组件,包括常量、变量、游标、过程和函数等

。在包规范中所定义的公用组件不仅可以在包内引用,而且也可以由其他的子程序引用。假定在定义包规范

emp_packge时,定义了公用变量g_deptno、公用过程add_employee和fire_employee,以及公用函数get_sal,那

么他们不仅可以在包emp_packge内引用,也可以由其他子程序引用。

---建立包规范create or replace package emp_package is  g_deptno number(3):=30;  procedure add_employee(eno number, ename varchar2,sal number,dno number default g_deptno);  procedure fire_employee(eno number);  function get_sal(eno number)return number;end emp_package;---end 后面可以跟命名的名称 当执行了以上命令之后,会建立包规范emp_package,并且定义了所有公用组件。但是因为只定义来了过程 和函数的头部,没有编写过程和函数的执行代码,所以公用的过程和函数只有在建立了包体之后才能调用。 (2)、建立包体     包体用于实现包规范所定义的过程和函数。当建立包体时,读者也可以单独定义私有组件,包括变量、常量 、过程和函数等,但在包体中所定义的私有组件只能在包内使用,而不能由其他子程序引用。假定在建立包体 emp_package时定义了函数validate_deptno,那么该函数只能包emp_package内使用,而不能由其他子程序调用 。     当建立包时,为了实现信息隐藏,应该在包体内定义私有组件,为了实现包规范中所定义的公用过程和函数 ,必须建立包体。 ----建立包体 create or replace package body emp_package is  function validate_deptno(v_deptno number)return boolean is       ----validate_deptno  v_temp int;begin  select 1 into v_temp from dept where deptno=v_deptno;  return true;exception  when no_data_found then return false;end validate_deptno;procedure add_employee(eno number, ename varchar2,sal number,dno number default g_deptno)is---add_employeebegin  if validate_deptno(dno)then      insert into emp(empno,ename,sal,deptno)values(eno,ename,sal,dno);  else     RAISE_ApPLICATION_ERROR(-20000,'不存在该部门');  end if;exception  when dup_val_on_index then RAISE_APpLICATION_ERROR(-20011,'该雇员已存在');end add_employee;procedure fire_employee(eno number)is            --------fire_employeebegin  delete from emp where empno=eno;  if sql%notfound then     RAISE_APPLICATION_ERROR(-20012,'该雇员不存在');  end if;end fire_employee;function get_sal(eno number)return number is ---get_sal  v_sal emp.sal%type;begin  select sal into v_sal from emp where empno=eno;  return v_sal;exception  when no_data_found then   RAISE_ApPLICATION_ERROR(-20012,'该雇员不存在');end get_sal;end emp_package;  当执行了以上命令之后,会建立包体emp_package,应用程序只能直接调用该包内的所有公有组件,而私有函 数validate_deptno则不能被应用程序调用。 (3)、调用包组件     对于包的私有组件,只能在包内调用,并且可以直接调用;而对于包的公用组件,既可以在宝贝调用,也可 以在其他应用程序中调用。但需要注意,当在其他应用程序中调用包的组件时,必须要家包名作为前缀(包名. 组件名)。 (一)、在同一个包内调用包组件     当调用同一个包内的其他组件时,可以直接调用,不需要加包名作为前缀。下面以包emp_package的过程 add_employee调用包内私有组件validate_deptno为例,说明调用同一个包内的其他组件的方法。 create or replace package body emp_package is  procedure add_employee(eno numberk,ename varchar2,salary number,dno number default g_deptno)isbegin  if validate_deptno(dno)then    insert into emp(empno,ename,sal,deptno)values(eno,ename,salary,dno);  else    raise_application_error(-20010,'不存在该部门');  end if;exception   when dup_val_on_index then    raise_application_error(-20011,'该雇员已存在');end; (二)、调用包公用变量     当在其他应用程序中调用包的共同变量时,必须要在公共变量名前加包名作为前缀,并注意其数值在当前会 话内一直生效。 declarebegin emp_package.g_deptno:=21;end; (三)、调用包公用过程    当在其他应用程序中调用包的公用过程时,必须要在公用过程名前加包名作为前缀。 declarebegin emp_package.add_employee(1212,'yang',2000,10);------部门不给值会报错 emp_package.add_employee(2121,'tender',2000,20);end; (四)、调用包的公用函数     当在其他应用程序中调用包的公用函数时,需要在函数名之前加包名作为前缀。因为函数只能作为表达式的 一部分来调用,所以应该定义变量接收函数的返回值。 declare salary number;begin salary:=emp_package.get_sal(7788); dbms_output.put_line(salary);end; (五)、以其他用户身份调用公用包组件     当以其他用户身份调用包的公用组件时,必须在组件名前加用户名和包名作为前缀(用户名.包名.组件名)。 ----SCOTT.EMP_PACKAGE.。。。。 (六)、调用远程数据库包的公用组件     当调用远程数据库包的公用组件时,在组件名之前加包名作为前缀,在组件名之后需要带有数据库链名作为 后缀(包名.组件名@数据库链名)。 EMP_PACKAGE.ADD_EMPLOYEE@TENDER(1111,'SCOTT',1233,10) (4)、查看包源代码     当建立了包之后,oracle会将包名及其源代码信息存放到数据字典中。通过查询数据字典user_source,可 以显示当前用户的包及其源代码。 select text from user_source where name='emp_package'and type='package' 纯度级别---WNDS用于限制函数不能修改数据库数据 --- WNPS 用于限制函数不能修改包变量 --- RNDS 用于限制函数不能读取数据库数据 --- RNPS  用于限制函数不能读取包变量

转载地址:http://bhzli.baihongyu.com/

你可能感兴趣的文章
Weapons of Mass Destruction, Detection
查看>>
环境资源与相关词汇中英文对照
查看>>
fluorenscence aerodynamic particcle sizer
查看>>
HOME - Research Highlights & Publications
查看>>
Leibniz Institute for Tropospheric Research
查看>>
Laser Spectroscopy Group
查看>>
顺风比EMS强多了!
查看>>
搭建CPU+GPU 集群
查看>>
手把手教你配置Windows2003集群(图)
查看>>
WIN7下开启无线网卡软AP
查看>>
CShell 简单语法
查看>>
Linux(CentOS)下把python脚本转化成可执行程序
查看>>
【Unity3D游戏开发】性能优化之Texture图片空间和内存占用分析(三七)
查看>>
【Unity3D游戏开发】material与sharedMaterial的区别 (三八)
查看>>
【Unity2D游戏实战 之 2D滚屏射击】1.背景滚动 (一)
查看>>
【Git+Source Tree使用教程之一】commit & push
查看>>
C#和.NET框架和术语
查看>>
【React Native】把现代web科技带给移动开发者(一)
查看>>
【GoLang】Web工作方式
查看>>
Launch Sublime Text 3 from the command line
查看>>