问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle %rowtype的用法

发布网友 发布时间:2022-04-07 18:58

我来回答

2个回答

懂视网 时间:2022-04-07 23:19

     说明

1.1       RECORD

  定义记录数据类型。它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的、分离的、基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型。在使用记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。

 定义记录数据类型的语法如下:

TYPE RECORD_NAME IS RECORD(

V1  DATA_TYPE1 [NOT NULL][:=DEFAULT_VALUE],

V2  DATA_TYPE2 [NOT NULL][:=DEFAULT_VALUE],

VN  DATA_TYPEN [NOT NULL][:=DEFAULT_VALUE]);

1.2       VARRAY

  数组是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY(variable array,即可变数组)。

  定义VARRAY数据类型的语法如下:

  TYPE VARRAY_NAMEIS VARRAY(SIZE) OF ELEMENT_TYPE [NOT NULL];

  其中,varray_name是VARRAY数据类型的名称,size是正整数,表示可以容纳的成员的最大数量,每个成员的数据类型是element_typeo默认时,成员可以取空值,否则需要使用NOT NULL加以限制。

 

1.3       TABLE

  定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于C语言中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

  定义记录表类型的语法如下:

  TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL]

  INDEX BY [BINARY_INTEGER|PLS_INTEGER|VARRAY2];

  关键字INDEX BY表示创建一个主键索引,以便引用记录表变量中的特定行。

  BINARY_INTEGER的说明

  如语句:TYPE NUMBERS  IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;其作用是,加了”INDEX BYBINARY_INTEGER ”后,NUMBERS类型的下标就是自增长,NUMBERS类型在插入元素时,不需要初始化,不需要每次EXTEND增加一个空间。

  而如果没有这句话“INDEXBY BINARY_INTEGER”,那就得要显示对初始化,且每插入一个元素到NUMBERS类型的TABLE中时,都需要先EXTEND。

2     举例

2.1       创建表结构以及数据准备

--组织机构结构表 
CREATE TABLE SF_ORG 
( 
ORG_ID INT NOT NULL, --组织机构主键ID 
ORG_NAME VARCHAR2(50),--组织机构名称 
PARENT_ID INT--组织机构的父级 
) 
 
--一级组织机构 
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(1, '一级部门1',0); 
 
--二级部门 
 
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(2, '二级部门2',1); 
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(3, '二级部门3',1); 
INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(4, '二级部门4',1); 

2.2       RECORD的使用举例

先定义一个只与SF_ORG表中某几个列的数据类型相同的记录数据类型TYPE_ORG_RECORD,然后声明一个该数据类型的记录变量V_ORG_RECORD,最后用替换变量&ORG_ID接受输入的雇员编码,查询并显示该雇员的这几列中的信息。注意,在使用RECORD数据类型的变量时要用“.”运算符指定记录变量名限定词。

  一个记录类型的变量只能保存从数据库中查询出的一行记录,如果查询出了多行记录,就会出现错误。

-- RECORD的使用举例
declare 
 type type_org_record is record( 
 v_name sf_org.org_name%type,
 v_parent sf_org.parent_id%type);
 
 v_record type_org_record;
begin 
 select org_name, parent_id into v_record from sf_org so 
 where so.org_id = &org_id; 
 dbms_output.put_line('部门名称:' || v_record.v_name); 
 dbms_output.put_line('上级部门编码:' || to_char(v_record.v_parent)); 
end; 
执行时会弹出一个输入框,如下图,执行完毕以后可以在输出中查看效果

技术分享
技术分享

2.3       VARRAY的使用举例

先定义一个能保存5个VARCHAR2(25)数据类型的成员的VARRAY数据类型ORG_VARRAY_TYPE,然后声明一个该数据类型的VARRAY变量V_ORG_VARRAY,最后用与ORG_VARRAY_TYPE数据类型同名的构造函数语法给V_ORG_VARRAY变量赋予初值并显示赋值结果。

注意,在引用数组中的成员时.需要在一对括号中使用顺序下标,下标从1开始而不是从0开始。

-- VARRAY的使用举例
declare 
 type org_varray_type is varray(5) of varchar2(25); 
 v_arr_set org_varray_type; 
begin 
 v_arr_set := org_varray_type('1','2','3','4','5'); 
 dbms_output.put_line('输出1:' || v_arr_set(1) || '、'|| v_arr_set(2) || '、'|| v_arr_set(3) || '、'|| v_arr_set(4)); 
 dbms_output.put_line('输出2:' || v_arr_set(5)); 
 v_arr_set(5) := '5001'; 
 dbms_output.put_line('输出3:' || v_arr_set(5)); 
end; 
技术分享

2.4       TABLE使用举例

2.4.1      存储单列多行

这个和VARRAY类似。但是赋值方式稍微有点不同,不能使用同名的构造函数进行赋值。具体的如下:

-- 存储单列多行
declare 
 type org_table_type is table of varchar2(25) 
 index by binary_integer; 
 v_org_table org_table_type; 
begin 
 v_org_table(1) := '1'; 
 v_org_table(2) := '2'; 
 v_org_table(3) := '3'; 
 v_org_table(4) := '4'; 
 v_org_table(5) := '5'; 
 dbms_output.put_line('输出1:' || v_org_table(1) || '、'|| v_org_table(2) || '、'|| v_org_table(3) || '、'|| v_org_table(4)||'、'|| v_org_table(5)); 
end;
2.4.2      存储多列多行和ROWTYPE结合使用

采用bulkcollect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。

-- 存储多列多行和rowtype结合使用
declare 
 type t_type is table of sf_org%rowtype; 
 v_type t_type; 
 begin 
 select org_id, org_name, parent_id bulk collect into v_type from sf_org where sf_org.org_id <= 3; 
 
 for v_index in v_type.first .. v_type.last loop 
 dbms_output.put_line(v_type(v_index).org_id ||' '|| v_type(v_index).org_name ||' '|| v_type(v_index).parent_id ); 
 end loop; 
 end; 
技术分享
2.4.3      存储多列多行和RECORD结合使用

采用bulkcollect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。

-- 存储多列多行和RECORD结合使用
declare 
 type test_emp is record 
 ( 
 c1 sf_org.org_name%type, 
 c2 sf_org.parent_id%type 
 ); 
 type t_type is table of test_emp; 
 v_type t_type; 
 begin 
 select org_name, parent_id bulk collect into v_type from sf_org where sf_org.org_id <= 3; 
 
 for v_index in v_type.first .. v_type.last loop 
 dbms_output.put_line(v_type(v_index).c1 || ' ' || v_type(v_index).c2); 
 end loop; 
 end; 
技术分享

3     问题

varry和table集合不能直接对其进行查询。只能对其进行遍历。

4    其他

  在我的Oracle 创建 split 和 splitstr 函数文章中,有包含table的查询示例图:http://blog.csdn.net/xiaokui_wingfly/article/details/45922141

%TYPE说明

为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个变量的数据类型时,就只能采用这种方法定义变量的数据类型。

%ROWTYP说明

如果一个表有较多的列,使用%ROWTYPE来定义一个表示表中一行记录的变量,比分别使用%TYPE来定义表示表中各个列的变量要简洁得多,并且不容易遗漏、出错。这样会增加程序的可维护性。

 为了使一个变量的数据类型与一个表中记录的各个列的数据类型相对应、一致,Oracle提供%ROWTYPE定义方式。当表的某些列的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个表的结构及其数据类型时,就只能采用这种方法定义变量的数据类型。

一行记录可以保存从一个表或游标中查询到的整个数据行的各列数据。一行记录的各个列与表中一行的各个列有相同的名称和数据类型。


参考文章:http://blog.csdn.net/liangweiwei130/article/details/38223319


ORACLE中record、varray、table和%type、%rowtype的使用详解

标签:record   varray   table   数据库   oracle   

热心网友 时间:2022-04-07 20:27

表示该类型为行数据类型,存储的是一行数据,一行数据里可以有多列,类似于表里的一行数据,也可以是游标里的一行数据,如:
vs_row1 表%rowtype;
vs_row2 游标%rowtype;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
海尔bcd-539wh压缩机是什么型号的?这款冰箱好不好? ...潜力对吗?那么一个人的潜力最多能发挥多少?用什么方式可以激发个人潜 ... 安东尼罗宾 是谁 ? 卡萨帝发展大事记 ...我上高中 并且很想学情非得已 问下大概多长时间能学会这首曲子... 为什么excel下拉的数字不递增啊? ...也几乎没有音乐基础的人来说,学会吉他(速成)需要多长时间。。_百度... excel下拉数字递增怎么设置 下拉数字递增设置方法 2024年微信朋友圈广告投放推广怎么做(收费标准) 达州微信朋友圈运营 狗急跳墙稳观特,,,打一动物,,十二生肖 十拿九稳是指什么生肖 十拿九稳...打一生肖 腾讯课堂如何同时登陆两台设备 单电源环牛变压器能作功放电源吗? tda2030功放电路单声道单电源? 如果一个集成功放采用单电源工作它的输出端是否需要大容量电容? 12V单电源直流电的功放板最大功率的有多少瓦? 12V大功率功放用什么IC的功率比较大? 2. 单电源2030功放 用电脑电源做10-30W单电源功放电源好不好啊? 以太网是什么网络 是电信的ADSL还是互联网? 以太网就是我们平常上网用的网络吗? 功放单电源悬浮电压一个电解坏了会有什么情况 一块功放板上有双电源,可是我要单电源,用那一组,会有影响吗? OCL电路是双电源互补功放,OTL是单电源互补功放? 大家推荐几个单电源的功放IC 不要数字功放 用12v供电(单电源),功率在30W以上,用什么功放IC?希望高手解答一下! 单电源功放电路(24V) 求助。单电源功放 单电源功放用负12伏和地做输入电压可以吗? 三四在后五六中,草人命更平常,天涯一四一身遥,九字上数一定稳代表什么生肖? 丁丁上的文件要发到微信上可是发生异常怎么办? 十分稳定开三十,一字千金合五行。是什么生肖 生肖玄机字辩猜一生肖 弯弯曲曲一字形 方方正正脚四稳 指12生肖哪个字 纏十二生肖意思 电脑玩游戏卡住了,音响持续发出嗯嗯的声音.什么都动不了.只能重启或者强制关机. 在玩LOL玩着玩着电脑就卡死了电脑还一直嗡嗡的响? qq微信总提示出现异常即将关闭是怎么回事 手机玩游戏突然卡住,然后嗡嗡响,等一会就好了 英格兰有女子足球超级联赛么? 打LOL电脑总莫名卡死,一直嗡嗡嗡响? 为什么我的笔记本打着游戏突然就卡住了,然后还一直翁嗡嗡响 你好!我的微信和QQ同步,为什么微信上一聊天就出现异常,疑似被盗呢 英超球队必须有女足 是强制规定吗 刚配的电脑 玩游戏卡机 一直滋的响只能重启 求大神指点 在英超足球联赛中可以有女球员参加吗? 手机玩游戏卡顿,卡住还会响,几秒后黑屏过一二分钟就好了是哪里坏了,在线等 英超热刺官博祝贺唐佳丽随女足夺冠,你对她有什么想说的? 英超女足有几亇俱乐部?