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;
输出结果: