PL/SQL_包1(开发包)

来源:互联网 发布:成都网络推广收入 编辑:程序博客网 时间:2024/06/05 00:08
包(Package)用于逻辑组合相关的PL/SQL类型(例如Table类型和Record类型)、PL/SQL项(例如游标和游标变量)和PL/SQL子程序(例如过程和函数)。通过使用PL/SQL包,不仅简化了应用设计,提高了应用性能,而且还可以实现信息隐藏、子程序重载等功能。

建立包

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
原创粉丝点击