Oracle Table、Type、Array的创建与使用

    Oracle支持Array类型,使得Oracle不用非得使用游标来遍历多行记录,本文演示了一个Object Array的创建,初始化和遍历取值,动态生成新的Array的方式。

一、创建表

BEGIN  
   DROP TABLE emp;  
EXCEPTION
  WHEN OTHERS THEN  
    IF sqlcode != -0942 THEN RAISE; END IF;  
END;  

CREATE TABLE jnkcde.emp(
       eid NUMBER,
       ename VARCHAR2(32),
       birthday DATE,
       empDay DATE 
);

COMMENT ON TABLE jnkcde.emp IS '雇员表';
COMMENT ON COLUMN jnkcde.emp.eid IS 'ID';
COMMENT ON COLUMN jnkcde.emp.ename IS '雇员姓名';
COMMENT ON COLUMN jnkcde.emp.ename IS '雇员生日';
COMMENT ON COLUMN jnkcde.emp.ename IS '雇佣日期';

--create synonym emp for jnkcde.emp; 

二、创建TYPE

CREATE OR REPLACE TYPE jnkcde.EMP_TYPE FORCE AS OBJECT
(
       eid NUMBER,
       ename VARCHAR2(32),
       birthday DATE,
       empDay DATE 
);

三、创建ARRAY

CREATE OR REPLACE TYPE jnkcde.EMP_ARR AS TABLE OF jnkcde.emp_type;

四、测试ARRAY

DECLARE 
   empArr emp_arr;      -- 雇员数组
   rowArr emp%ROWTYPE;  -- emp表的行类型
   newArr emp_arr;       -- 新生成的数组
   tmpObj emp_type;      -- 临时对象,用来生成新数组
BEGIN
   empArr := emp_arr(emp_type(1,'杰克尔',to_date('1990-01-02','yyyy-mm-dd'),to_date('2012-06-02','yyyy-mm-dd')),
                     emp_type(2,'杰瑞米',to_date('1980-01-02','yyyy-mm-dd'),to_date('2012-06-03','yyyy-mm-dd')),
                     emp_type(3,'杰三哥',to_date('1985-01-02','yyyy-mm-dd'),to_date('2012-06-04','yyyy-mm-dd')));
   newArr := emp_arr(); -- 初始化,否则调用会报错

   -- 输出老数组并生成新数组
   dbms_output.put_line('empArr:');
   FOR ii IN empArr.first .. empArr.Last LOOP
     dbms_output.put_line(empArr(ii).eid ||' '||empArr(ii).ename||' '||empArr(ii).birthday||' '||empArr(ii).empDay);
     
     -- 创建新的对象
     tmpObj := emp_type(empArr(ii).eid,empArr(ii).ename,empArr(ii).birthday,empArr(ii).empDay);
     newArr.extend();-- 扩展
     newArr(newArr.last) := tmpObj;-- 将对象赋值给新数组
     
   END LOOP; -- end loop
   
   -- 输出新数组
   dbms_output.put_line('newArr:');
   FOR ii IN newArr.first .. newArr.last LOOP
     dbms_output.put_line(newArr(ii).eid ||' '||newArr(ii).ename||' '||newArr(ii).birthday||' '||newArr(ii).empDay);
   END LOOP;
         
   rowArr.eid := empArr(empArr.first).eid;
   rowArr.ename := empArr(empArr.first).ename;
   rowArr.birthday := empArr(empArr.first).birthday;
   rowArr.empDay := empArr(empArr.first).empDay;
   
   dbms_output.put_line('rowArr:');
   dbms_output.put_line(rowArr.eid||' '||rowArr.ename||' '||rowArr.birthday||' '||rowArr.empDay);
   
END;

输出结果:








  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值