包的初始化


例:

需求: 使用一个索引表存存放所有的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

猜你喜欢

转载自blog.csdn.net/u011165335/article/details/78877102