`
jetwill
  • 浏览: 15598 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

存储包(PACKAGE)

阅读更多
存储包的语法
●包规格部
CREATE OR REPLACE PACKAGE 包名 { AS | IS }
存储过程定义;
存储函数定义;
变量定义;
数据类型定义;
异常定义;
游标定义;
END [ 包名 ];

●包本体
CREATE OR REPLACE PACKAGE BODY 包名 { AS | IS }
针对包规格部の存储过程定义的程序;
针对包规格部の存储函数定义的程序;
只能在包本体内部调用的存储过程程序;
只能在包本体内部调用的存储函数程序;
END [包名];

存储包由包规格部和包本体两部分构成。

●包规格部
定义可以从包外部或包全局访问的存储过程、存储函数、变量、异常、数据类型、游标。
只对存储过程、存储函数的接口进行定义,而在包本体中才对存储过程、存储函数进行具体实现。

●包本体
针对包规格部中定义的存储过程、存储函数进行具体实现。
或者编写只能在包本体内部访问的存储过程、存储函数。

示例1)包规格部的定义
create or replace package dept_utl as
 
  -- 函数 get_dept_name 的定义
 function get_dept_name(v_dept_id in char) return varchar2;
  -- 过程 insert_dept的定义
 procedure insert_dept(v_dept_id in char,v_dept_name in varchar2);
  -- 异常 e_deptNotFound 的定义
 e_deptNotFound exception;
 
end dept_utl;


示例2)包本体的定义
create or replace package body dept_utl as
 
 -- 函数 get_dept_name 的本体
 function get_dept_name(v_dept_id in char) return varchar2 as
  v_dept_name varchar2(10);
 begin
  select dept_name into v_dept_name from dept 
   where dept_id = v_dept_id;
  if sql%notfound then
   raise e_deptNotFound;
  end if;
  return v_dept_name;
 end get_dept_name;
 
 -- 过程 insert_dept 的本体
 procedure insert_dept(v_dept_id in char,v_dept_name in varchar2) as
 begin
  insert into dept values(v_dept_id,v_dept_name);
  commit;
 end insert_dept;
 
end dept_utl;


示例3)从SQL中调用上述包的函数[get_dept_name]
SQL> select dept_utl.get_dept_name('D01') from dual;
 
DEPT_UTL.GET_DEPT_NAME('D01')
-----------------------------------------------------------------------
 
总务
 
SQL>


示例4)从匿名块中执行上述包中的存储过程。
declare
 
begin
 
 dept_utl.insert_dept('D04','营业');
 
end;


匿名块
存储过程(PROCEDURE)
存储函数(FUNCTION)
存储包(PACKAGE)
触发器(TRIGGER)
PL/SQL的数据类型
PL/SQL的运算符(计算、赋值、结合、连结、指数、比较)
PL/SQL的变量和常量
%TYPE属性和%ROWTYPE属性
PL/SQL的内置函数
PL/SQL的执行权限(AUTHID)
以独立事务执行PL/SQL

→PL/SQL
→首页
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics