Oracle Nested table、Record
1.如何在PL/SQL中创建和使用Nested table;
2.如何在PL/SQL中创建和使用Record;
1.如何在PL/SQL中创建和使用Nested table
DECLARE
/**创建一个 nested table **/
TYPE type_nstb_noind_var is table of varchar2(300);
/** 创建一个索引类型为varchar的nested table,也可以指定其它类型(BINARY_INTEGER、PLS_INTEGER、String、Long、RAW、LONG RAW、ROWID,CHAR,CHARACTER) **/
Type type_nstb_var is table of varchar2(300) index by varchar2(30); /** 创建一个包含索引并且不能为空的 nested table **/
Type type_nstb_con_notnull is table of varchar2(300) index by varchar2(300) not null;
/** 根据 emp 表的ename列类型创建 nested table **/
TYPE type_nstb_ename is table of emp.ename%type; /**定义游标 **/
CURSOR MYCUR IS SELECT ENAME FROM EMP; /**根据游标类型创建 nested table **/
type type_nestb_bycur is table of mycur%rowtype; /** nested table 没有存储值限制,未初始化时默认值为null,使用时要引用 **/
/** 定义变量引用 **/
v_noind type_nstb_noind_var;
v_var type_nstb_var;
v_noind_append type_nstb_noind_var;
v_noind_delete type_nstb_noind_var; PROCEDURE P(STR VARCHAR2) is
BEGIN
DBMS_OUTPUT.PUT_LINE(STR);
END; BEGIN
/**初始化 nested table:**/
v_noind:=type_nstb_noind_var('American','China','Japan'); /**每个位值不能超过指定最大值**/
P('get v_noind first index value: '||V_NOIND.FIRST);/**获得第一个索引下标值**/
P('get v_noind last index value: '||V_NOIND.LAST); /**获得最后一个索引下标值**/
P('get v_noind by index 1: '||V_NOIND(1)); /**获得第一个索引下标对应值**/
p('get v_noind first value by first index value: '||v_noind(v_noind.first)); /**也可以这样获取值**/
v_noind(3):='Englind'; /**替换一个索引下标对应的值**/ /**输出所有值 **/
FOR J IN V_NOIND.FIRST..V_NOIND.LAST LOOP
P('using loop print v_noind('||j||') value:'||V_NOIND(J));
END LOOP; /** 从emp表中取出ename列所有值到nested table **/
SELECT ENAME BULK COLLECT INTO V_NOIND FROM EMP; /**如果涉及操作的数据量比较大,可以先定义游标,然后分批从游标中提取数据**/
OPEN MYCUR; /** 打开游标 **/
FETCH MYCUR BULK COLLECT INTO V_NOIND LIMIT 10; /**10代表每次提取的数据量,这在批量处理更新数据是会很有用**/
LOOP
FOR I IN V_NOIND.FIRST..V_NOIND.LAST LOOP
P('v_noind('||i||')value:'||V_NOIND(I));
END LOOP;
FETCH MYCUR BULK COLLECT INTO V_NOIND LIMIT 10;
EXIT WHEN MYCUR%NOTFOUND; /** 当游标内无数据是退出循环 **/
END LOOP;
CLOSE MYCUR; /** 关闭游标 **/ /** 也可以像这样取数 **/
OPEN MYCUR;
LOOP FETCH MYCUR BULK COLLECT INTO V_NOIND LIMIT 10;
FOR I IN V_NOIND.FIRST..V_NOIND.LAST LOOP
P(V_NOIND(I));
END LOOP;
EXIT WHEN MYCUR%NOTFOUND;
END LOOP; /** Nested table 未指定索引下标类型时,默认为number类型;如果想保存其它类型的索引下标类型,则在创建Nested table 时指定 INDEX BY VARCHAR2(300)或其它类型(BINARY_INTEGER、PLS_INTEGER、String、Long、RAW、LONG RAW、ROWID,CHAR,CHARACTER) **/
/**为索引下标类型为varchar2的nested table赋值**/
v_var('A'):='China';
v_var('B'):='Japen';
v_var('C'):='German';
p('get v_var first index value: '||v_var.first); /**获得第一个索引下标**/
p('get v_var first value: '||v_var(v_var.first)); /**获得第一个索引下标对应的值**/
p('get v_var contain element count: '||v_var.count); /**获得Nested table 存储总数**/
if(v_var.exists('B'))then /**判断某个索引下标值是否存在**/
p('China has in v_var nested table');
end if; p('get v_var next value by index "B":'||v_var(v_var.next('B'))); /** 获取索引下标'B'的下一个值 **/
p('get v_var prior value by index "C":'||v_var(v_var.prior('C'))); /** 获取索引下标'C'的上一个值 **/
/**遍历**/
v_first:=v_var.first;
loop
dbms_output.put_line(v_first);
v_first:=v_var.next(v_first);
if(v_first=v_var.last)then
exit;
end if;
end loop;
/**向nested table 内添加项,此方法不能用于指定了索引下标类型 INDEX BY ..的nested table **/
v_noind_append:=type_nstb_noind_var();
v_noind_append.extend; /**向nested table 内添加一个空项**/
v_noind_append.extend(2); /** 向nested table 内添加一个索引下标为2的项 **/
v_noind_append(2):='Append2'; /** 为刚添加的索引下标项2赋值 **/
v_noind_append.extend(3,2); /** 根据索引下标为2 的项在nested table 内添加3个新项,值一样,但索引下标不一样**/
for i in v_noind_append.first..v_noind_append.last loop
p('v_noind('||i||'):'||v_noind_append(i));
end loop; v_noind_delete:=type_nstb_noind_var('one','two','three','four','five','six','seven','eight','night','ten');
v_noind_delete.delete(1); /**删除nested table 项1**/
v_noind_delete.delete(2,4);/**删除第2项到第4项**/
v_var.delete('A'); /**如果定义type是使用了INDEX BY.. 指定索引项类型,则可以通过key删除项**/
for i in v_noind_delete.first..v_noind_delete.last loop /**注意如果删除中间项后打印会报错(ORA-01403: no data found)**/
p('print after delete v_noind_delete('||i||'):'||v_noind_delete(i));
end loop;
END;
2.如何在PL/SQL中创建和使用Record
declare
type nstb_job is table of varchar2(30) ; /**定义Record**/
type ts_record is record
(
id emp.empno%type, /**定义record字段id类型是emp表empno列类型**/
name varchar2(30), /**定义record字段name类型是varchar2**/
dept Tdept%rowtype, /**定义record 字段dept类型是tdept表 **/
item_no number(5) not null :=10,/**定义record字段item_no字段不能为空且默认值是10 注:指定不能为空时必须有默认值**/
job NSTB_JOB, /**定义record字段job 类型是nested table**/
orderno number :=10 /**定义record 字段orderno并初始化**/
);
rd_emp emp%rowtype; /**定义record tb_emp,字段内容是emp表**/
ts ts_record; /**使用record前必须引用**/ PROCEDURE P(STR VARCHAR2) is
BEGIN
DBMS_OUTPUT.PUT_LINE(STR);
END; begin
/**初始化record***/
ts.id:=100;
ts.name:='sywu';
ts.dept.deptno:=12; /**因为dept是类型(表),初始化时必须初始化类型(表)**/
ts.dept.dname:='IBM';
ts.dept.loc:='ssdtes';
ts.job:=NSTB_JOB('java developer','oracle database administrator'); /**初始化job,注意:如果定义类型时指定了Index by .. 是不能这样初始化的,会报类型不在此区域错误**/
p('id:'||ts.id||' name:'||ts.name||' deptno:'||ts.dept.deptno||' job:'||ts.job(ts.job.first)); /**将dept 表中的某一列导入到record ts的dept 类型中**/
select * into ts.dept from dept where rownum=1;
p('deptno:'||ts.dept.deptno||' dname:'||ts.dept.dname||' loc:'||ts.dept.loc); /**将emp 表中的某一列导入到record rd_emp中**/
select * into rd_emp from emp where empno=7369;
p('empno:'||rd_emp.empno||' job:'||rd_emp.job);
end;
总结:Nested table: 无存储值限值,可以存储一条或多条记录,无需初始化,默认为null,可以在数据库或PL/SQL中使用.可以使用默认索引下标或定义索引下标,自定义添加删除项,可以分批提取游标中的数据,使用时必须引用;
Record:一次运行中只能提取一条记录,只能在PL/SQL中使用,不能在数据库中使用,可以定义类型、数据类型字段;可以在函数、存储过程中做参数使用。
Oracle Nested table、Record的更多相关文章
- [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- Oracle GoldenGate 三、加密
写在开始前 从上周开始,我花了大量的业余时间阅读GoldenGate官方文档,并根据文档实践和进一步学习了解GoldenGate,以下便是根据官方文档理解总结的GoldenGate学习内容: Orac ...
- Oracle GoldenGate 二、配置和使用
Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...
- Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle删除表、字段之前判断表、字段是否存在
这篇文章主要介绍了Oracle删除表.字段之前判断表.字段是否存在的相关资料,需要的朋友可以参考下 在Oracle中若删除一个不存在的表,如 “DROP TABLE tableName”,则会提示: ...
- Oracle系列:记录Record
Oracle系列:记录Record 分类: [Oracle] (15) 版权声明:本文为博主原创文章,未经博主允许不得转载. Oracle系列:记录(Record) 一,什么是记录(Record) ...
- oracle partition table 分区表详解
Oracle partition table 分区表详解 分区表就是通过使用分区技术,将一张大表,拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性.分区表中,每个分 ...
- oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用
oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错.误删恢复之外,较少被用于产生更有价值的用途. 各种闪回表flashback ...
- Oracle 基本操作--数据类型、修改和删除表、增删改查和复制表
一.Oracle基础数据类型:数据类型: 创建数据表时,设计数据表的结构问题,也就是设计及确定数据表中各个列的数据类型,是数值.字符.日期还是图像等其他类型. 因为只有设计好数据表结构,系统才会在磁盘 ...
随机推荐
- “FPGA+云"助力高性能计算
用AI防鲨鱼.用AI学写中国书法.用AI预测人类死亡时间.用AI审判罪犯……在人工智能方兴未艾的今天,越来越廉价和普及的AI领域真的是什么都不值钱,除了想象力.那在这无所不能的AI盛世,一定没道理让算 ...
- FPGA学习的一点总结
做FPGA主要是要有电路的思想,作为初学者,往往对器件可能不是熟悉,那么应该要对数字电路的知识熟悉. FPGA中是由触发器和查找表以及互联线等基本结构组成的,其实在逻辑代码里面能够看到的就是与非门以及 ...
- 解决近期linux下yum更新出现HTTP Error 404 NOT FOUND错误的办法
本文转载自:http://tech.lezi.com/archives/47 最近两天使用yum的163源,出现404错误 [root@localhost yum.repos.d]# yum make ...
- Spring Cloud Bus 消息总线 RabbitMQ
Spring Cloud Bus将分布式系统中各节点通过轻量级消息代理连接起来. 从而实现例如广播状态改变(例如配置改变)或其他的管理指令. 目前唯一的实现是使用AMQP代理作为传输对象. Sprin ...
- PS1 长命令回到行首进行覆盖
linux shell 命令输入过长导致折行后的命令回到行首进行覆盖,第二行的时候又能自动换到下一行了,导致这个问题的原因是没有设置正确的 PS1 变量 家目录下打开 vim .bashrc 修改 P ...
- HTML5 本地存储 [转]
1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本地客户端程序优于 we ...
- Converter(转换器)与Formatter(格式化) ,Validator(验证器)
Converter(转换器)与Formatter(格式化)都可以用于将一种对象类型转换为另一种对象类型.Converter是通用元件,可以在应用程序的任意层中使用,而Fotermatter这是专门为W ...
- Window下MySql 5.6 安装后内存占用很高的问题
Window下MySql 5.6 安装后内存占用很高的问题 刚刚准备玩一把mysql,初学者 环境是window 7和window sever 2008, mysql是最新的5.6, 发现的问题是安装 ...
- CentOS下如何从vi编辑器插入模式退出到命令模式
刚打了下关于vi编辑器的命令,发现一直退出不了.后来自己敲着敲着它就退出了,写博客记录下. 比如现在w文件夹下面有一个ww文件 我进入这个文本,输入命令 vi ww,未回车,情况如下 按了回车,就进入 ...
- 读《分布式一致性原理》JAVA客户端API操作2
创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...