Oracle索引表、集合 [实例]

--索引表的用法
--使用binary_integer

declare
type ename_table_type is table of scott.emp.ename%type
      index by binary_integer;
type ehiredate_table_type is table of scott.emp.hiredate%type
       index by binary_integer;
ename_table ename_table_type;
ehiredate_table ehiredate_table_type;
begin
select ename,hiredate into ename_table(0),ehiredate_table(0) from scott.emp
where scott.emp.empno=7369;
dbms_output.put_line(ename_table(0));
dbms_output.put_line(to_char(ehiredate_table(0),'yyyy-mm-dd hh24:mi:ss'));
end;

-- 使用 varchar2 索引表时

DECLARE

TYPE area_table_type IS TABLE OF NUMBER INDEX BY varchar(20);
area_index_table area_table_type;
BEGIN

area_index_table('上海') :=1;
area_index_table('北京') :=2;
area_index_table('天津') :=3;
dbms_output.put_line('地点 : '|| area_index_table.first );
dbms_output.put_line('地点 : '|| area_index_table('北京') );
dbms_output.put_line('地点 : '|| area_index_table.last );
END;



--   使用 嵌套表
-- 索引表的类型不能作为表列的类型,而嵌套表的类型可以作为表列的类型
DECLARE
TYPE ename_table_type IS TABLE OF SCOTT.emp.ename%TYPE;
ename_nest_table ename_table_type;
BEGIN
ename_nest_table :=ename_table_type('dongguoh','hello','third','hello','third'); -- 要使用 嵌套表,必需先初始化,下标从 1 开始
SELECT ename INTO ename_nest_table(2) FROM SCOTT.emp WHERE empno=&no;
dbms_output.put_line('雇员名 : ' || ename_nest_table(2));
END;


-- 在表列中使用 嵌套表作为表中的一个成员,那么必需先创建这个被嵌套表的类型    ,p166

CREATE TYPE phone_type IS TABLE OF VARCHAR2(20);

CREATE TABLE employee (
id NUMBER (4),
name VARCHAR2(10),
sal NUMBER(6,2),
phone phone_type    -- 注意这句
) NESTED TABLE phone STORE AS phone_table;

--在 嵌套表中插入数据 如下
BEGIN
      INSERT INTO employee VALUES(1,'dongguoh2',1000,phone_type('0471-345678','34567976')); -- 注意这里
END;
   
   
   
    --在 嵌套表中 检索 数据 ,先定义变量接收数据 ,如下 P167

DECLARE
   phone_table phone_type ;
BEGIN
   SELECT phone INTO phone_table FROM employee WHERE id=1;
   For i IN 1..phone_table.COUNT LOOP
       dbms_output.put_line('电话号码为 : '|| phone_table(i));  
   END LOOP;
END ;


--更新嵌套表列的数据 ,定义 变量 ,并用构造方法初始化


DECLARE
   phone_table phone_type := phone_type('0872-567890','5678906789','5678-567895678','5678957895');
BEGIN
   phone_table(1) :='123456789';
   phone_table(2) :='987643';
   UPDATE employee SET phone=phone_table WHERE id=1;
END ;



-- 使用可变数组 VARRAY

DECLARE
   TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
   ename_table ename_table_type :=ename_table_type('dong'); -- 必需初始化
BEGIN
   SELECT ename INTO ename_table(1) FROM emp WHERE empno=&no;
   dbms_output.put_line('名字为 : ' || ename_table(1));    -- 注意下标不要超出范围
END ;

-- 多维集合的应用 P169

DECLARE
   TYPE array1 IS VARRAY(20) OF INT ;
   TYPE array2 IS VARRAY(10) OF array1;
  
   towArray array2 :=array2(array1(100,101,102),
                            array1(201,202),
                            array1(301,302,303,304));
BEGIN
FOR i IN 1..towArray.COUNT LOOP
      FOR j IN 1..towArray(i).COUNT LOOP
          DBMS_OUTPUT.PUT_LINE('ARRAY( ' || i || ',' || j || ') = ' || towArray(i)(j));   -- 注意 towArray(i)(j) 的写法
      END LOOP;
END LOOP;

END;


SELECT * FROM emp;
-- PL/SQL 记录表

DECLARE
TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_table emp_table_type;
CURSOR cur_emp_table(v_empno NUMBER) IS SELECT * FROM emp WHERE empno<v_empno;
v_incr INT :=1;
BEGIN
-- 用FOR 语句的时候 隐式
/*
FOR i_cur IN cur_emp_table(&no) LOOP
     emp_table(v_incr) :=i_cur;
     DBMS_OUTPUT.PUT_LINE('编号 :'|| emp_table(v_incr).empno || ' 名称 :' || emp_table(v_incr).ename);
     v_incr:=v_incr+1;    
END LOOP;
*/
-- 显示的 LOOP

/*
OPEN cur_emp_table(&no);
LOOP
       FETCH cur_emp_table INTO emp_table(v_incr);
       v_incr:=v_incr+1;    
       EXIT WHEN cur_emp_table%NOTFOUND;

END LOOP;
CLOSE cur_emp_table;
*/

OPEN cur_emp_table(&1);
    FETCH cur_emp_table INTO emp_table(v_incr);
     v_incr:=v_incr+1;
   
    while cur_emp_table%FOUND LOOP
       FETCH cur_emp_table INTO emp_table(v_incr);
       v_incr:=v_incr+1;     
    END LOOP;
CLOSE cur_emp_table;
DBMS_OUTPUT.PUT_LINE('emp_table.first:'|| emp_table.first || ' 名称 :' || emp_table.LAST || '   v_incr: ' ||   v_incr);
    
FOR i IN emp_table.first..emp_table.LAST LOOP -- 注意这里的范围,当你取出的数据为空的时候会报错
     DBMS_OUTPUT.PUT_LINE('编号 :'|| emp_table(i).empno || ' 名称 :' || emp_table(i).ename);
END LOOP;
END ;

猜你喜欢

转载自new-fighter.iteye.com/blog/1401518