七、包的创建和应用:
包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL程序设计元素的封装。包类似于C++和Java语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。
与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即他们的作用域不同。
一个包由两个分开的部分组成:包定义(PACKAGE,包定义部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。);包主体(PACKAGE BODY,包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中海可以声明包的私有元素。)。
例1:
create or replace package demo_pack
is
deptrec dept%rowtype;
function add_dept(dept_no number,dept_name varchar2,location varchar2)
return number;
function remove_dept(dept_no number)
return number;
procedure query_dept(dept_no in number);
end demo_pack;
create or replace package body demo_pack
is
function add_dept(dept_no number,dept_name varchar2,location varchar2)
return number
is
empno_remaining exception;
pragma exception_init(empno_remaining,-1);
/* -1 是违反唯一约束条件的错误代码 */
begin
insert into dept values(dept_no,dept_name,location);
if sql%found then
return 1;
end if;
exception
when empno_remaining then
return 0;
when others then
return -1;
end add_dept;
function remove_dept(dept_no number)
return number
is
begin
delete from dept where deptno = dept_no;
if sql%found then
return 1;
else
return 0;
end if;
exception
when others then
return -1;
end remove_dept;
procedure query_dept(dept_no in number)
is
begin
select * into deptrec from dept where deptno = dept_no;
exception
when no_data_found then
dbms_output.put_line('数据库中没有编码为'||dept_no||'的部门');
when too_many_rows then
dbms_output.put_line('程序运行错误!请使用游标');
when others then
dbms_output.put_line(sqlcode||'---'||sqlerrm);
end query_dept;
begin
null;
end demo_pack;
对包内共有元素的调用:
declare
var number;
begin
var := demo_pack.add_dept(90,'administrator','beijing');
if var = -1 then
dbms_output.put_line(sqlcode||'--'||sqlerrm);
elsif var = 0 then
dbms_output.put_line('该部门记录已经存在!');
else
dbms_output.put_line('添加记录成功!');
demo_pack.quer_dept(90);
dbms_output.put_line(demo_pack.deptrec.deptno||'--'||demo_pack.dep);
var:=demo_dept.remove_dept(90);
if var=-1 then
dbms_output.put_line(sqlcode||'--'||sqlerrm);
elsif var=0 then
dbms_output.put_line('该部门记录不存在!');
else
dbms_output.put_line('删除成功!');
end if;
end if;
end;
例2:
create or replace package emp_package
is
type emp_table_type is table of emp%rowtype index by binary_integer;
procedure read_emp_table(p_emp_table out emp_table_type);
end emp_package;
create or replace package body emp_package
is
porcedure read_emp_table(p_emp_talbe out emp_table_type)
is
l binary_integer:=0;
begin
for emp_record in (select * from emp) loop
p_emp_table(i):=emp_record;
l:=l+1;
end loop;
end read_emp_table;
end emp_package;
declare
e_table emp_package.emp_table_type;
begin
emp_package.read_emp_table(e_table);
for l in e_table.first .. e_table.last loop
dbms_output.put_line(e_table(i).empno||'--'||e_table(i).empname);
end loop;
end;
例3:
create sequence empseq start with 1000 increment by 1 order nocycle;
create sequence deptseq start with 50 increment by 10 order nocycle;
create or replace package emp_mgmt
as
function hire(ename varchar2,job varchar2,mgr number,sal number,comm number, deptno number) return number;
function create_dept(dname varchar2,loc varchar2) return number;
procedure remove_emp(empno number);
procedure remove_dept(deptno number);
procedure increase_sal(empno number,sal_incr number);
procedure increase_comm(empno number,comm_incr number);
end emp_mgmt;
create or replace package body emp_mgmt
as
tot_emps number;
tot_depts number;
no_sal exception;
no_comm exception;
function hire(ename varchar2,job varchar2,mgr number,sal number,comm number, deptno number)
return number is
new_empno number(4);
begin
select empseq.nextval into new_empno from dual;
insert into emp values(new_empno,ename,job,mgr,sysdate,sal,comm,deptno);
tot_emps:=tot_emps+1;
return(new_empno);
exception
when others then
dbms_output.put_lien('发生其他错误');
end hire;
function create_dept(dname varchar2,loc varchar2)
return number is
new_deptno number(4);
begin
select deptseq.nextval into new_deptno from dual;
insert into dept values(new_deptno,dname,loc);
tot_depts:=tot_depts+1;
return(new_deptno);
exception
when others then
dbms_output.put_line("发生其他错误");
end create_dept;
procedure remove_emp(empno number)
is
no_result exception;
begin
delete from emp where emp.empno=remove_emp.empno;
if sql%notfound then
raise no_result;
end if;
tot_emps:=tot_emps-1;
exception
when no_result then
dbms_output.put_line('你需要的数据不存在!');
when others then
dbms_output.put_line('发生其他错误');
end remove_emp;
procedure remove_dept(deptno number)
is
no_result exception;
e_deptno_remaining exception;
pragma exception_init(e_deptno_remaining,-2292);
/* -2292 是违反一致性约束的错误代码 */
begin
delete from dept where dept.deptno=remove_dept.deptno;
if sql%notfound then
raise no_result;
end if;
tot_depts:=tot_depts-1;
exception
when no_result then
dbms_output.put_line('你需要的数据不存在!');
when e_deptno_remaining then
dbms_output.put_line('违反数据完整性约束!');
when others then
dbms_output.put_line('发生其他错误');
end remove_dept;
procedure increase_sal(empno number,sal_incr number)
curr_sal number(7,2);
begin
select sal into curr_sal from emp where emp.empno=increase_sal.empno;
if curr_sal is null then
raise no_sal;
else
update emp set sal=sal+increase_sal.sal_incr where emp.empno=increase_sal.empno;
end if;
exception
when no_data_found then
dbms_output.put_line('你需要的数据不存在');
when no_sal then
dbms_output.put_line('此员工的工资不存在');
when others then
dbms_output.put_line('发生其他错误');
end increase_sal;
procedure increase_comm(empno number,comm_incr number)
curr_comm number(7,2);
begin
select comm into curr_comm from emp where emp.empno=increase_comm.empno;
if curr_comm is null then
raise no_comm;
else
update emp set comm=comm+increase_comm.comm_incr where emp.empno=increase_comm.empno;
end if;
exception
when no_data_found then
dbms_output.put_line('你需要的数据不存在');
when no_comm then
dbms_output.put_line('此员工的奖金不存在');
when others then
dbms_output.put_line('发生其他错误');
end increase_comm;
end emp_mgmt;
分享到:
相关推荐
以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...
在本教程中,我们将深入探讨PL/SQL的基础知识,包括其与SQL的关系、程序设计的基本结构和组成元素。 ### SQL与PL/SQL SQL(Structured Query Language)是用于管理关系数据库的标准语言,主要负责数据查询、更新和...
此外,书中还涉及到了ORACLE数据库的安装、存储过程的编写、序列操作、数据类型转换、程序设计指导原则、合并数据库中的数据行(MERGE)、约束、索引、子查询、分页技术等高级主题。 最后,还有关于字符串、数值、...
PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...
这本“PL/SQL超级笔记”显然是针对初学者设计的,旨在帮助他们掌握这一强大的数据库编程工具。 PL/SQL的组成部分包括声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量、游标等;执行部分包含SQL语句...
PL/SQL程序通常由以下几部分组成: 1. **声明部分**:用于声明变量、常量等。 2. **执行部分**:包含具体的执行逻辑,如SQL语句和其他过程化语句。 3. **异常处理部分**:用于捕获并处理可能发生的错误或异常情况。...
1. PL/SQL程序设计简介 PL/SQL是Oracle数据库系统中的核心组成部分,它允许开发者创建复杂的数据处理逻辑。通过PL/SQL,可以编写一系列的SQL语句,并加入控制流语句(如条件判断、循环)、异常处理等,形成一个完整...
### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...
这些笔记涵盖了SQL和PL/SQL的基础知识,适合初学者了解和掌握数据库操作的基本概念和语法。随着经验的积累,开发者可以深入学习高级特性和最佳实践,如性能优化、并发控制、数据库设计等,以提升在Oracle数据库环境...
1.2 PL/SQL程序结构 一个基本的PL/SQL块通常包含以下部分: - DECLARE:声明部分,用于定义变量、常量和游标等。 - BEGIN:执行部分,放置执行的语句,如SQL语句和过程调用。 - EXCEPTION:异常处理部分,用于捕获...
本文将深入探讨PL/SQL程序设计中的一些关键知识点,包括基本语法、记录类型、流程控制、游标使用、异常处理、存储函数与存储过程以及触发器。 1. PL/SQL基本语法: PL/SQL程序由声明、执行和异常处理三部分组成。...
这篇学习笔记主要关注如何在Oracle数据库中使用PL/SQL的FORALL语句进行批量操作,以及如何利用批绑定(Bulk Binding)来提升性能。此外,笔记还涵盖了存储过程中的参数传递,特别是传入数组的方法,以及SQL优化的...
此外,通过将业务逻辑封装在PL/SQL子程序中,可以实现模块化的程序设计,使得代码更易于维护和复用。例如,可以创建一个过程或函数来处理特定的业务规则,然后在多个地方调用这个子程序。 PL/SQL还提供了异常处理...
- **PL/SQL** (Procedural Language for SQL) 是 Oracle 数据库的一种扩展,它允许用户在 SQL 的基础上进行更复杂的程序设计。 - **特性**: - **变量与常量定义**:支持变量和常量的定义,增强数据处理能力。 - *...
PL/SQL程序由声明部分、执行部分和异常处理部分组成。基本的PL/SQL块结构如下: DECLARE -- 声明部分: 声明变量、类型、游标和局部存储过程或函数 BEGIN -- 执行部分: 包含程序主体,包括过程和SQL语句 EXCEPTION...
**PL/SQL程序设计简介** PL/SQL是Oracle数据库中的一种结构化查询语言,它将SQL与过程式编程语言相结合,提供了更强大的数据库操作能力。本笔记版详细介绍了PL/SQL的设计与应用,适合初学者及有一定基础的开发者...
Oracle SQL编程是数据库管理的重要组成部分,特别是在Oracle数据库系统中,SQL与PL/...学习和熟练掌握这些Oracle SQL和PL/SQL的基本概念和技术,将有助于你有效地管理Oracle数据库,编写高效、安全的数据库应用程序。
开发PL/SQL程序通常需要使用特定的开发工具。SQL*Plus是Oracle提供的一种命令行工具,适合基础的PL/SQL开发,例如创建存储过程或显示错误信息。而PL/SQL Developer是一款更高级的集成开发环境(IDE),提供了更丰富...