create or replace package TEST_DATATYPE is
TYPE MYRECORD IS RECORD(
V_ID A_LOG.ID%TYPE,
V_PROC_NAME A_LOG.PROCE_NAME%TYPE,
V_LOG_LEVEL A_LOG.LOG_LEVEL%TYPE,
V_LOG_INFO A_LOG.LOG_INFO%TYPE);
PROCEDURE DATATYPE;
FUNCTION TEST_RETURN_RECORD RETURN MYRECORD;
end TEST_DATATYPE;
create or replace package body TEST_DATATYPE is
PROCEDURE DATATYPE IS
--1、表的列
/* 我真是个傻逼,为什么在临分处理的时候要定义那么多变量,
直接用这种数据类型不就完了吗*/
TABLEROW_A_LOG A_LOG%ROWTYPE;
--2、记录类型record
/* 记录类型跟上面的rowtype有很大的区别吗,感觉在用法上可以替代;
函数的返回值可以是record类型的
*/
RECORD1 MYRECORD;
--3、数组类型array 和 varray(varray与array在以下用法上完全相同)
/* 3.1、声明和初始化可以分开
3.2、初始化的长度就是实际长度,该长度不能超过定义时的长度
3.3、在初始化的基础上进行长度扩充时,必须先用extend
3.4、扩充之后的长度不得超过定义时的长度
3.5、扩充之后的值默认为空
*/
TYPE MYARR IS ARRAY(7) OF VARCHAR2(10); --定义
ARR1 MYARR; --声明
ARR2 MYARR := MYARR('A', 'B', 'C');
---4、table 分为加INDEX BY BINARY_INTEGER和不加INDEX BY BINARY_INTEGER两种
/* 4.1、声明和初始化
没加:声明和初始化可以分开
加: 只能进行声明,不能初始化,赋值只能按下标一个一个赋值
4.2、扩充
没加:扩充必须要先用extend
加:直接按下标赋值即可
注:团险拆分责任的时候应该用加了index的table来存储找到的责任
*/
TYPE MYTABLE IS TABLE OF VARCHAR2(10);
TABLE1 MYTABLE := MYTABLE('1', '2');
TABLE2 MYTABLE;
TYPE MYTABLE2 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
TABLE4 MYTABLE2;
--5、table 加index by varchar2(32)
/* 4.1、只能进行声明,不能初始化
4.2、有自己特殊的赋值方式
4.3、key值唯一
4.4、有自己特殊的遍历方式
*/
TYPE MYTABLE_VAR IS TABLE OF VARCHAR2(32) INDEX BY VARCHAR2(10);
TABLE5 MYTABLE_VAR;
V_KEY VARCHAR2(10);
BEGIN
--2、记录类型测试
RECORD1 := TEST_RETURN_RECORD;
DBMS_OUTPUT.PUT_LINE(RECORD1.V_ID);
--3、数据array测试
DBMS_OUTPUT.PUT_LINE('数组测试');
ARR1 := MYARR('1', '2'); --初始化
ARR1.EXTEND; --长度扩充
ARR1(3) := '5';
ARR1.EXTEND;
DBMS_OUTPUT.PUT_LINE('数组定长:' || ARR1.LIMIT);
DBMS_OUTPUT.PUT_LINE('数组实际长度:' || ARR1.COUNT);
DBMS_OUTPUT.PUT_LINE('数组首位元素下标:' || ARR1.FIRST);
DBMS_OUTPUT.PUT_LINE('数组末位元素下标:' || ARR1.LAST);
FOR I IN 1 .. ARR1.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(ARR1(I));
END LOOP;
FOR I IN 1 .. ARR2.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(ARR2(I));
END LOOP;
--4、table测试
DBMS_OUTPUT.PUT_LINE('table测试');
DBMS_OUTPUT.PUT_LINE('table定长:' || TABLE1.LIMIT);
DBMS_OUTPUT.PUT_LINE('table实际长度:' || TABLE1.COUNT);
DBMS_OUTPUT.PUT_LINE('table首位元素下标:' || TABLE1.FIRST);
DBMS_OUTPUT.PUT_LINE('table末位元素下标:' || TABLE1.LAST);
--4、1、初始化
TABLE2 := MYTABLE('A', 'B', 'C', 'D');
--4.2、增加值
TABLE1.EXTEND(2);
TABLE1(4) := '4';
FOR I IN 1 .. TABLE1.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TABLE1(I));
END LOOP;
FOR I IN 1 .. TABLE2.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TABLE2(I));
END LOOP;
TABLE4(1) := 'a';
TABLE4(2) := 'b';
FOR I IN 1 .. TABLE4.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TABLE4(I));
END LOOP;
--5、table测试
TABLE5('KEY1') := 'KEY1';
TABLE5('KEY1') := 'KEY11';
TABLE5('KEY3') := 'KEY13';
V_KEY := TABLE5.FIRST;
LOOP
DBMS_OUTPUT.PUT_LINE(V_KEY || '--->' || TABLE5(V_KEY));
V_KEY := TABLE5.NEXT(V_KEY);
EXIT WHEN V_KEY IS NULL;
END LOOP;
END DATATYPE;
FUNCTION TEST_RETURN_RECORD RETURN MYRECORD IS
RECORD1 MYRECORD;
BEGIN
SELECT A.ID, A.PROCE_NAME, A.LOG_LEVEL, A.LOG_INFO
INTO RECORD1
FROM A_LOG A
WHERE ROWNUM = 1;
RETURN RECORD1;
END TEST_RETURN_RECORD;
end TEST_DATATYPE;