oracle存储数据结构,十、oracle存储过程中的数据结构

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值