PL/SQL_包1(开发包)
来源:互联网 发布:成都网络推广收入 编辑:程序博客网 时间:2024/06/05 00:08
包(Package)用于逻辑组合相关的PL/SQL类型(例如Table类型和Record类型)、PL/SQL项(例如游标和游标变量)和PL/SQL子程序(例如过程和函数)。通过使用PL/SQL包,不仅简化了应用设计,提高了应用性能,而且还可以实现信息隐藏、子程序重载等功能。
语法如下:
2、建立包体
语法如下:
示例一:在同一个包内调用包组件
建立包
1、建立包规范语法如下:
CREATE [OR REPLACE] PACKAGE package_nameIS | AS public type and item declarations subprogram specificationsEND package_name;示例如下:
CREATE OR REPLACE PACKAGE emp_packageAS g_deptno NUMBER(3) := 30; PROCEDURE add_employee(eno NUMBER,NAME VARCHAR2, salary NUMBER,dno NUMBER DEFAULT g_deptno); PROCEDURE fire_employee(eno NUMBER); FUNCTION get_sal(eno NUMBER) RETURN NUMBER;END emp_package;/当执行了以上命令之后,会建立包规范emp_package,并且定义了所有公用组件。但因为只定义了过程和函数的头部,没有编写过程和函数的执行代码,所以公用的过程和函数只有在建立了包体之后才能调用。
2、建立包体
语法如下:
CREATE [OR REPLACE] PACKAGE BODY package_nameIS | AS private type and item declarations subprogram bodiesEND package_name;示例如下:
CREATE OR REPLACE PACKAGE BODY emp_packageAS --验证部门编号是否存在 FUNCTION validate_deptno(v_deptno NUMBER) RETURN BOOLEAN IS 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; --添加员工 PROCEDURE add_employee(eno NUMBER,NAME VARCHAR2, salary NUMBER,dno NUMBER DEFAULT g_deptno) IS BEGIN IF validate_deptno(dno) THEN INSERT INTO emp(empno,ename,sal,deptno) VALUES (eno,NAME,salary,dno); ELSE RAISE_APPLICATION_ERROR(-20010,'不存在该部门'); END IF; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20011,'该雇员不存在'); END; --删除员工(根据员工编号) PROCEDURE fire_employee(eno NUMBER) IS BEGIN DELETE FROM emp WHERE empno = eno; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20012,'该雇员不存在'); END IF; END; --根据员工编号获得工资 FUNCTION get_sal(eno NUMBER) RETURN NUMBER IS 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;END emp_package;/3、调用包组件
示例一:在同一个包内调用包组件
--添加员工PROCEDURE add_employee(eno NUMBER,NAME VARCHAR2, salary NUMBER,dno NUMBER DEFAULT g_deptno)ISBEGIN IF validate_deptno(dno) THEN INSERT INTO emp(empno,ename,sal,deptno) VALUES (eno,NAME,salary,dno); ELSE RAISE_APPLICATION_ERROR(-20010,'不存在该部门'); END IF; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20011,'该雇员不存在');END;示例二:调用包公用变量
SQL> EXEC emp_package.g_deptno := 30;示例三:调用包公用过程
SQL> EXEC emp_package.add_employee(1111,'MARY',2000);SQL> EXEC emp_package.add_employee(1112,'CLARK',2000,10);示例四:调用包公用函数
SQL> VAR salary NUMBER;SQL> EXEC :salary := emp_package.get_sal(7788);SQL> print salary;示例五:以其他用户身份调用包公用组件
SQL> conn SYSTEM/bdqn;SQL> EXEC scott.emp_package.add_employee(1115,'SCOTT',2000);SQL> EXEC scott.emp_package.fire_employee(1115);示例六:调用远程数据库包的公用组件
SQL> EXEC emp_package.add_employee@orcl_link(1116,'SCOTT',2000);查看包源代码
SELECT text FROM user_source WHERE NAME='EMP_PACKAGE' AND TYPE='PACKAGE';
0 0
- PL/SQL_包1(开发包)
- pl/sql开发包
- PL/SQL_触发器1(触发器简介)
- 包(pl/sql)
- PL/SQL_处理例外1(预定义例外)
- pl/sql(3)---包
- PL/SQL_触发器2(行触发器)
- PL/SQL_使用复合数据类型1(PL/SQL记录)
- PL/SQL_使用复合数据类型2(PL/SQL集合)
- PL/SQL包2(使用包重载)
- PL/SQL包3(使用包构造过程)
- PL/SQL包
- PL/SQL-包
- PL/SQL-包
- PL/SQL 包
- pl/sql 中的 包
- PL/SQL 的包
- PL/SQL 中的包
- 使用EF6和MVC5实现一个简单的选课系统--EF6的弹性链接和命令拦截(4/12)
- java SE 集合(三)
- KMP中next数组的理解
- 割点、桥、双连通分量
- 国外最猛的开源软件站 源码站
- PL/SQL_包1(开发包)
- 堆栈知识
- string::getline()和istream::getline()的区别
- configure: error: C++ compiler cannot create executables
- 使用EF6和MVC5实现一个简单的选课系统--EF6的代码优先迁移和部署(5/12)
- 队列知识
- [Android第三方类库]greenDao使用心得(一)
- 这才刚开始
- error C1083异常