例:
需求: 使用一个索引表存存放所有的dept记录,包括新增的
使用begin初始化这个索引表
使用cursor的包变量
create orreplace package insert_pkgis --定义一个游标变量,可以不要return cursor c_dept_info return dept%rowtype; --索引 type dept_index is table of dept%rowtypeindex by pls_integer; v_dept_index dept_index; --函数 function insert_dept_fun(p_deptno dept.deptno%type,p_dname dept.dname%type,p_loc dept.loc%type)return boolean;
end insert_pkg;
create orreplace package body insert_pkg is --初始化游标 cursor c_dept_info return dept%rowtypeis select * from dept;
function insert_dept_fun(p_deptno dept.deptno%type,p_dname dept.dname%type,p_loc dept.loc%type) return boolean is begin --如果添加的数据不在表中 if not v_dept_index.exists(p_deptno)then
insert into dept (deptno, dname, loc)values (p_deptno, p_dname, p_loc); v_dept_index(p_deptno).deptno := p_deptno; v_dept_index(p_deptno).dname := p_dname; v_dept_index(p_deptno).loc := p_loc; return true; else return false; end if;
end insert_dept_fun;
begin --初始化索引表 for v_dept_row in c_dept_info loop v_dept_index(v_dept_row.deptno):=v_dept_row; end loop;
exception when othersthen dbms_output.put_line(sqlerrm); end insert_pkg; --测试 begin dbms_output.put_line(insert_pkg.v_dept_index(10).deptno||chr(9)||insert_pkg.v_dept_index(10).dname);
if insert_pkg.insert_dept_fun(60,'部门名称5','地址')then dbms_output.put_line(insert_pkg.v_dept_index(60).deptno||chr(9)||insert_pkg.v_dept_index(60).dname); else dbms_output.put_line('已存在数据'); end if;
end; 仅作演示,实际开发很少定义 包变量 |
经典题目:参考:http://www.itpub.net/thread-1911232-1-1.html
CREATE ORREPLACE PACKAGE plch_pkg IS g_colors DBMS_SQL.varchar2_table;
PROCEDURE show_colors; END; /
CREATE ORREPLACE PACKAGE BODY plch_pkg IS PROCEDURE show_colors IS BEGIN DBMS_OUTPUT.put_line ('Count='|| g_colors.COUNT); END; BEGIN DBMS_OUTPUT.put_line ('Set colors'); g_colors (1):= 'Blue'; g_colors (1000):= 'Red'; END; /
哪些选项执行之后会导致 "Set colors" 被显示两次?
(A) BEGIN DBMS_OUTPUT.put_line ('Go!'); plch_pkg.show_colors; END; /
BEGIN plch_pkg.show_colors; END; /
(B) BEGIN DBMS_OUTPUT.put_line ('Go!'); plch_pkg.show_colors; plch_pkg.show_colors; END; /
(C) BEGIN DBMS_OUTPUT.put_line ('Go!'); plch_pkg.show_colors; END; /
BEGIN DBMS_SESSION.reset_package; END; /
SET SERVEROUTPUT ON;
BEGIN plch_pkg.show_colors; END; /
(D) BEGIN DBMS_OUTPUT.put_line ('Go!'); plch_pkg.show_colors; END; /
ALTER PACKAGE plch_pkgCOMPILE /
BEGIN plch_pkg.show_colors; END; /
(E) BEGIN DBMS_OUTPUT.put_line ('Go!'); plch_pkg.show_colors; END; /
/*CREATE OR REPLACE PACKAGE plch_pkg IS g_colors DBMS_SQL.varchar2_table;
PROCEDURE show_colors; END; / */ CREATE ORREPLACE PACKAGE plch_pkg IS g_colors DBMS_SQL.varchar2_table;
PROCEDURE show_colors; END; /
BEGIN plch_pkg.show_colors; END; /
答案CD
A: 对show_colors的第一次调用将包初始化(执行了初始化代码)。第二次调用时,包已经初始化,所以初始化代码没有再次执行。 B: 同A C: DBMS_SESSION.RESET_PACKAGE的调用将我会话中的包状态复位了,所以当我第二次调用show_colors过程,包被第二次初始化。 D: 我手工将包强制重编译,这意味着我会话中的状态被设置为未初始化,而初始化代码被再次执行。 E: 尽管看起来我重新编译了包,实际上编译器注意到我的包说明并没有任何改变——因此包头没有被重编译, 包状态没有复位,初始化代码也没有再次执行。 如果再加上头编译,那么就等价于D的COMPILE |