CREATE PACKAGE MY_PACKAGE IS DEPT_NUM NUMBER; --Cursor manager_cur; FUNCTION F_DEPT_NUM( IN_DEPTNO IN SCOTT.EMP.DEPTNO%TYPE ) RETURN NUMBER; PROCEDURE P_DEPT_NUM( IN_DEPTNO IN SCOTT.EMP.DEPTNO%TYPE, OUT_NUM OUT NUMBER ); END MY_PACKAGE;
包体部分:
包体部分是包的描述部分中游标、函数及过程的定义,格式如下:
1 2 3 4
Create package body<包名> As 游标、函数、过程的具体意义; End<包名>;
CREATEOR REPLACE PACKAGE BODY MY_PACKAGE AS FUNCTION F_DEPT_NUM( IN_DEPTNO IN SCOTT.EMP.DEPTNO%TYPE ) RETURN NUMBER AS OUT_NUM NUMBER; BEGIN SELECT COUNT(*) INTO OUT_NUM FROM SCOTT.EMP WHERE DEPTNO=IN_DEPTNO; RETURN OUT_NUM; END F_DEPT_NUM; PROCEDURE P_DEPT_NUM( IN_DEPTNO IN SCOTT.EMP.DEPTNO%TYPE, OUT_NUM OUT NUMBER ) AS BEGIN SELECT COUNT(*) INTO OUT_NUM FROM SCOTT.EMP WHERE DEPTNO=IN_DEPTNO; END P_DEPT_NUM; END MY_PACKAGE;
DECLARE NUM NUMBER; BEGIN NUM:=MY_PACKAGE.F_DEPT_NUM(20); DBMS_OUTPUT.PUT_LINE('THE NUM OF DEPT 20 IS ' || TO_CHAR(NUM)); MY_PACKAGE.P_DEPT_NUM(10, NUM); DBMS_OUTPUT.PUT_LINE('THE NUM OF DEPT 10 IS ' ||TO_CHAR(NUM)); END;
包中游标的使用
首先定义一个包头,存放游标变量类型
1 2 3 4 5 6
CREATEOR REPLACE PACKAGE SELECT_TABLE IS TYPE MANAGER_RCD IS RECORD (ENAME SCOTT.EMP.ENAME%TYPE, SAL SCOTT.EMP.SAL%TYPE, EDEPT SCOTT.EMP.DEPTNO%TYPE ); -- 定义一个记录类型 TYPE T_MANAGERREF IS REFCURSORRETURN MANAGER_RCD; --定义一个游标变量类型 END SELECT_TABLE; --定义一个包用来存放自定义的类型
例2:创建一个完整的包 :包头和包体
包头
1 2 3 4 5 6 7 8 9
CREATEOR REPLACE PACKAGE TEST_PACKAGE IS FUNCTION AVGSAL( IN_DEPTNO IN NUMBER ) RETURN NUMBER; --声明函数 PROCEDURE MANAGER_INF( MANAGER_CUR OUT SELECT_TABLE.T_MANAGERREF ); --声明过程 END TEST_PACKAGE;
CREATEOR REPLACE PACKAGE BODY TEST_PACKAGE IS FUNCTION AVGSAL( IN_DEPTNO IN NUMBER ) RETURN NUMBER AS AVG_SAL NUMBER; BEGIN SELECT AVG(SAL) INTO AVG_SAL FROM SCOTT.EMP WHERE DEPTNO=IN_DEPTNO; RETURN AVG_SAL; END AVGSAL; --定义函数 PROCEDURE MANAGER_INF( MANAGER_CUR OUT SELECT_TABLE.T_MANAGERREF ) AS--过程manager_inf带有一个out类型的参数manager_cur,该参数是一个类型为select_table.t_managerref的游标变量 BEGIN OPEN MANAGER_CUR FOR SELECT ENAME, SAL, DEPTNO FROM SCOTT.EMP WHERE LOWER(JOB)='MANAGER'; --打开游标变量 END MANAGER_INF; END TEST_PACKAGE;