【oracle】复合数据类型

1123-02 更新 复合数据类型
复合数据类型举例

1.record
set serveroutput on;
/* 复合数据类型——记录:for循环中 给 记录类型变量 赋值*/
declare
cursor v_cursor is
select t.serial_no,t.type_code,t.brand_code,t.brand_name from t_sales t;
--定义 记录类型(显示定义)
type t_record is record(
serial_no t_sales.serial_no%type,
type_code t_sales.type_code%type,
brand_code t_sales.brand_code%type,
brand_name t_sales.brand_name%type
);
--定义 记录变量
v_record t_record;
begin
for i_row in v_cur loop
--赋值方式1
--v_record := i_row;

--赋值方式2
v_record.serial_no := i_row.serial_no;
v_record.type_code := i_row.type_code;
v_record.brand_code := i_row.brand_code;
v_record.brand_name := i_row.brand_name;
dbms_output.put_line(v_record.serial_no||','||v_recod.type_code||','||v_record.brand_code||','||v_recoed.brand_name);
end loop;
exception
when others then
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

2.集合
2.1 index_by表
set serveroutput on;
/* 复合数据类型——index_by :定义(标量),赋值*/
declare
type _t_index_by is table of varchar2(30) index by binary_integer;
v_ib t_index_by;
begin
v_ib(-1) := 'hello';
v_ib(0) := 'world';
v_ib(2) := ' Kitty'; --index_by 是稀疏的(下标可以不连续)
dbms_output.put_line(v_ib(-1)||','||v_ib(0)||','||v_ib(2));
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——index_by :定义(记录),赋值*/
declare
type t_record is record(
emp_id tab_emp.emp_id%type,
emp_depart tab_emp.emp_depart%type,
emp_name tab_emp.emp_name%type,
emp_salary tab_emp.emp_salary%type
);

type t_index_by is table of t_record index by binary_integer;
v_ib t_index_by;
v_ib2 t_index_by;

cursor v_cursor is
select emp_id,emp_depart,emp_name,emp_salart from tab_emp where emp_id <= 4;
cursor v_cursor2 is
select emp_id,emp_depart,emp_name,emp_salart from tab_emp where emp_id <= 4;
begin
--二维数组 元素 的引用方式 collection_element.record_column
----赋值方式1. select into
select emp_id,emp_depart,emp_name,emp_salary
into v_ib(-1).emp_id, v_ib(-1).emp_depart, v_ib(-1).emp_name, v_ib(-1).emp_salary
from tab_emp where emp_id = 1;
dbms_output.put_line(v_ib(-1).emp_id||','|| v_ib(-1).emp_depart||','|| v_ib(-1).emp_name||','|| v_ib(-1).emp_salary);
----赋值方式2. :=
v_ib(-1).emp_id := v_ib(-1).emp_id + 10;
dbms_output.put_line(v_ib(-1).emp_id||','|| v_ib(-1).emp_depart||','|| v_ib(-1).emp_name||','|| v_ib(-1).emp_salary);
----赋值方式3. fetch into 逐行提取游标
open v_cursor;
loop
fetch v_cursor into v_ib(v_ib.last()+1);
exit when v_cursor%notfound;
dbms_output.put_line(v_ib(v_ib.last()).emp_id||','|| v_ib(v_ib.last()).emp_depart||','|| v_ib(v_ib.last()).emp_name||','|| v_ib(v_ib.last()).emp_salary);
end loop;
close v_cursor;
----赋值方式4. fetch bulk collect into 一次性提取游标
open v_cursor2;
fetch v_cursor2 bulk collect into v_ib2;
for i in 1..v_ib2.count() loop
dbms_output.put_line(v_ib(i).emp_id||','|| v_ib(i).emp_depart||','|| v_ib(i).emp_name||','|| v_ib(i).emp_salary);
end loop;
close v_cursor2;
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——index_by :定义(标量),函数*/
declare
type t_index_by is table varchar2(30) index_by binary_integer;
v_ib t_index_by;
begin
v_ib(-1) := 'hello';
v_ib(0) := 'world';
v_ib(2) := ' Kitty';
v_ib(3) := ' 3';
v_ib(4) := 4;
v_ib(1) := ' hi';

--函数
dbms_output.put_line(v_ib.count()); --元素个数
dbms_output.put_line(v_ib.limit()); --元素限制:null
dbms_output.put_line(v_ib.first()); --起始元素的下标 -1
dbms_output.put_line(v_ib.last()); --最后一个元素的下标 2
dbms_output.put_line(v_ib.next(v_ib.last())); --返回下一个元素的下标:null
dbms_output.put_line(v_ib.prior(v_ib.first())); --返回上一个元素的下标:null

/*index_by非法的方法
exist()
extend()
extend(n) --扩展元素到末尾(n:扩展元素个数)
extend(n,e_idx) --复制元素到末尾(e_idx:元素下标)
*/

dbms_output.put_line('元素个数:'||v_ib.count());
v_ib.delete(1);
dbms_output.put_line('v_ib.delete(1):'||v_ib.count());
--dbms_output.put_line('v_ib(1)='||v_ib(1)); --100ORA-01403: no data found
v_ib.delete(2,3);
dbms_output.put_line('v_ib.delete(2,3):'||v_ib.count());
v_ib.delete();
dbms_output.put_line('v_ib.delete():'||v_ib.count());
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

2.2 nested_table
set serveroutput on;
/* 复合数据类型——nested_table:定义(标量),初始化,赋值*/
declare
type t_nested_table is table of varchar2(30);
v_ntab t_nested_table;

cursor v_cursor is
select emp_name from tab_emp where emp_id=1;
begin
--初始化:构造函数 ,格式:类型名([参数列表])
v_ntab := t_nested_table(); --初始化为 null,使用前需要先extend
v_ntab := t_nested_table('001','002','003'); --初始化为 3个元素
--赋值
----赋值方式1. select into
select 111,222 into v_ntab(1),v_ntab(2) from dual;
dbms_output.put_line(v_ntab(1)||','||v_ntab(2));
----赋值方式2. :=
v_ntab(1) := to_number(v_ntab(1))+1;
v_ntab(2) := v_ntab(2)+10; --oracle的隐式转换,运算符+ 当且仅当 左右操作数均为字符串时 才做 字符串加
dbms_output.put_line(v_ntab(1)||','||v_ntab(2));
----赋值方式3. fetch into
open v_cursor;
fetch v_cursor into v_ntab(3);
close v_cursor;
dbms_output.put_line(v_ntab(1)||','||v_ntab(2)||','||v_ntab(3));
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——nested_table :定义(记录),初始化,赋值*/
declare
type t_record is record(
emp_id tab_emp.emp_id%type,
emp_depart tab_emp.emp_depart%type,
emp_name tab_emp.emp_name%type,
emp_salary tab_emp.emp_salary%type
);
v_record01 t_record;
v_record02 t_record;

type t_nested_table is table of t_record;
v_ntab t_nested_table;

cursor v_cursor is
select emp_name from tab_emp where emp_id = 1;

cursor v_cursor2 is
select emp_id,emp_depart,emp_name,emp_salary from tab_emp where emp_id <= 3;
begin
select 1,'10','chris',5600 into v_record01 from dual;
select 2,'20','May',4700 into v_record02 from dual;
--初始化
v_ntab := t_nested_table();
v_ntab := t_nested_table(v_record01,v_record02,v_record02);
dbms_output.put_line(v_ntab(1).emp_id||','|| v_ntab(1).emp_depart||','||v_ntab(1).emp_name||','|| v_ntab(1).emp_salary);
dbms_output.put_line(v_ntab(2).emp_id||','|| v_ntab(2).emp_depart||','||v_ntab(2).emp_name||','|| v_ntab(2).emp_salary);
dbms_output.put_line(v_ntab(3).emp_id||','|| v_ntab(3).emp_depart||','||v_ntab(3).emp_name||','|| v_ntab(4).emp_salary);
--赋值
1. select into
select 3,'10','Stephen',4900 into v_ntab(3) from dual;
select 3,'10','Stephen',4900 into v_ntab(3).emp_id,v_ntab(3).emp_depart,v_ntab(3).emp_name,v_ntab(3).emp_salary from dual;

dbms_output.put_line(v_ntab(3).emp_id||','|| v_ntab(3).emp_depart||','||v_ntab(3).emp_name||','|| v_ntab(3).emp_salary);
2. :=
v_ntab(1).emp_id := v_ntab(1).emp_id +10;
dbms_output.put_line(v_ntab(1).emp);
3. fetch into
open v_cursor;
fetch v_cursor into v_ntab(3).emp_name;
close v_cursor;
dbms_output.put_line(v_ntab(3).emp_id||','|| v_ntab(3).emp_depart||','||v_ntab(3).emp_name||','|| v_ntab(3).emp_salary);
5. fetch bulk collect into
open v_cursor2;
fetch v_cursor2 bulk collect into v_ntab; --v_ntab初始化了3个元素,则有3个元素可以访问
close v_cursor2;
--nested_table默认下标连续
for i in 1..v_ntab.count() loop
dbms_output.put_line(v_ntab(i).emp_id||','|| v_ntab(i).emp_depart||','||v_ntab(i).emp_name||','|| v_ntab(i).emp_salary);
end loop;
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——nested_table:定义(标量),函数*/
declare
type t_nested_table is table of varchar2(30);
v_ntab t_nested_table;
begin
v_ntab := t_nested_table();
v_ntab := t_nested_table('001','002','003');
dbms_output.put_line(v_ntab(1)||','||v_ntab(2)||','||v_ntab(3));

--函数
dbms_output.put_line(v_ib.count()); --元素个数
dbms_output.put_line(v_ib.limit()); --元素限制:null
dbms_output.put_line(v_ib.first()); --起始元素的下标:默认为1
dbms_output.put_line(v_ib.last()); --最后一个元素的下标 2
dbms_output.put_line(v_ib.next(v_ib.last())); --返回下一个元素的下标:null
dbms_output.put_line(v_ib.prior(v_ib.first())); --返回上一个元素的下标:null

/*index_by非法的方法
exist()
*/

if v_ntab.count() <4 then
v_ntab.extend(2); --在末尾 扩展2个元素(元素值为null)
v_ntab.extend(3,1); --在末尾 扩展3个元素(元素值为下标为3的元素值的副本)
end if;
dbms_output.put_line(v_ntab.last());
dbms_output.put_line('取后3个元素:'||v_ntab(v_ntab.last())||','|| v_ntab(v_ntab.last()-1)||','|| v_ntab(v_ntab.last()-2) );

dbms_output.put_line('元素个数:'||v_ntab.count());
v_ntab.delete(1);
dbms_output.put_line('v_ntab.delete(1):'||v_ntab.count());
--dbms_output.put_line('v_ntab(1)='||v_ntab(1)); --100ORA-01403: no data found
v_ntab.delete(2,3);
dbms_output.put_line('v_ntab.delete(2,3):'||v_ntab.count());
v_ntab.delete();
dbms_output.put_line('v_ntab.delete():'||v_ntab.count());
begin
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

2.3 vararry|varying array
set serveroutput on;
/* 复合数据类型——varray|varying array :定义(标量),初始化,赋值*/
declare
--type t_varray is varray(3) of varchar2(30);
type t_varray is varying array(3) of vatchar2(30);
v_varray t_varray;
cursor v_cursor is
select emp_name from tab_emp where emp_id = 1;
begin
--初始化
v_varray := t_varry();
v_varray := t_varray('001','002','003');
dbms_output.put_line(v_varray(1)||','||v_varray(2)||','||v_varray(3));
--赋值
----1. select into
select 111,222 into v_varray(1),v_varray(2) from dual;
dbms_output.put_line(v_varray(1)||','||v_varray(2));
----2. :=
v_ntab(1) := v_ntab(1) + 10;
dbms_output.put_line(v_varray(1));
----3. fetch into
open v_cursor;
fetch v_cursor into v_varray(3);
close v_cursor;
dbms_output.put_line(v_varray(1)||','|| v_varray(2)||','|| v_varray(3));
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——varray|varying array :定义(记录),初始化,赋值*/
declare
type t_record is record(
emp_id tab_emp.emp_id%type,
emp_depart tab_emp.emp_depart%type,
emp_name tab_emp.emp_name%type,
emp_salary tab_emp.emp_salary%type
);
v_record01 t_record;

--type t_varray is varray(3) of ;
type t_varray is varying array(3) of t_record;
v_array t_varray;

cursor v_cursor is
select emp_name from tab_emp where emp_id = 1;

cursor v_cursor2 is
select emp_id,emp_depart,emp_name,emp_salary from tab_emp where emp_id <= 3;
begin
select 1,'10','chris',5600 into v_record01 from dual;
v_record01.emp_id := 1;
v_record01.emp_depart := '10';
v_record01.emp_name := 'chris';
v_record01.emp_salary := 5600;
--初始化
v_varray := t_varray();
v_varray := t_varray(v_record01);
dbms_output.put_line(v_varray(1).emp_id||','|| v_varray(1).emp_depart||','||v_varray(1).emp_name||','|| v_varray(1).emp_salary);
--赋值
----1. select into
select 101,'10_10','chris',5600 into v_varray from dual;
dbms_output.put_line(v_varray(1).emp_id||','|| v_varray(1).emp_depart||','||v_varray(1).emp_name||','|| v_varray(1).emp_salary);
----2. :=
v_varray(1).emp_id := v_varray(1).emp_id +10;
dbms_output.put_line(v_varray(1).emp_id||','|| v_varray(1).emp_depart||','||v_varray(1).emp_name||','|| v_varray(1).emp_salary);
----3. fetch into
open v_cursor;
fetch v_cursor into v_varray(1);
close v_cursor;
dbms_output.put_line(v_varray(1).emp_id||','|| v_varray(1).emp_depart||','||v_varray(1).emp_name||','|| v_varray(1).emp_salary);
----4. fetch bulk collect into
--dbms_output.put_line(v_varray(2).emp_id); --未初始化,不能访问
v_varray := t_varray(v_record01,v_record01,v_record01); --max_size=3,且初始化了3个元素,则可以访问3个元素
open v_cursor2;
fetch v_cursor2 bulk collect into v_varray;
close v_cursor2;
for i in 1..v_varray.count() loop
dbms_output.put_line(v_varray(i).emp_id||','|| v_varray(i).emp_depart||','||v_varray(i).emp_name||','|| v_varray(i).emp_salary);
end loop;
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

set serveroutput on;
/* 复合数据类型——varray|varying array :定义(标量),函数*/
declare
--type t_varray is varray(3) of varchar2(30);
type t_varray is varying array(3) of vatchar2(30);
v_varray t_varray;
begin
--初始化
v_varray := t_varray();
v_varray := t_varray('001','002');
--v_varray := t_varray('001','002','003','004'); --报错 ORA-06532:Subscript outside of limit. 因为max_size=3
dbms_output.put_line(v_varray(1)||','||v_varray(2));

--函数
dbms_output.put_line(v_varray.count()); --元素个数
dbms_output.put_line(v_varray.limit()); --元素限制:max_size
dbms_output.put_line(v_varray.first()); --起始元素的下标:默认为1
dbms_output.put_line(v_varray.last()); --最后一个元素的下标 2
dbms_output.put_line(v_varray.next(v_varray.last())); --返回下一个元素的下标:null
dbms_output.put_line(v_varray.prior(v_varray.first())); --返回上一个元素的下标:null

/*index_by非法的方法
exist()
delete(idx)
delect(idx1,idx2)
*/

v_varray.extend(1); --max_size限制内,扩展并初始化1个元素(元素值默认为null)
-- v_varray.extend(); --等价于 v_varray.extend(1);
dbms_output.put_line(v_varray.count()||':'||v_varray(1)||','||v_varray(2)||','||v_varray(3));
v_varray(3) := '003'; --说明extend后 元素已经初始化了

v_varray.extend(1,2); -- max_size限制内,扩展并初始化1个元素(元素值默认为下标2元素的值的副本)
dbms_output.put_line(v_varray.count()||':'||v_varray(1)||','||v_varray(2)||','||v_varray(3) ||','||v_varray(4) );

dbms_output.put_line('元素个数:'||v_varray.count());
v_varray.delete();
dbms_output.put_line(' v_varray.delete()后, 元素个数:'||v_varray.count());
exception
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

posted on 2018-04-05 11:59 绿Z 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/greenZ/p/8721830.html

【oracle】复合数据类型相关推荐

  1. oracle组合数据类型,oracle复合数据类型-ZT

    http://www.itpub.net/viewthread.php?tid=610297&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1 ...

  2. 浅谈oracle复合数据类型

    原文位于:http://www.itpub.net/viewthread.php?tid=610297&extra=page%3D2%26amp%3Bfilter%3Ddigest --本文档 ...

  3. oracle复合数据类型

    嵌套表定义: TYPE type_naem AS TABLE OF element_type[NOT NULL] 嵌套表内建函数: 1.使用了构造函数进行初始化(可以带元素) 2.EXTEND==== ...

  4. oracle组合数据类型,oracle复合数据类型-相关方法

    oracle提供了一些内置的函数和方法来操作复合数据类型. 一.count 返回集合中的元素的个数 declare type ename_table_type is table of varchar2 ...

  5. oracle数据库加复合组件,浅谈oracle复合数据类型 (2)

    二.集合 类似C语言中的数组,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表. PL/SQL有三种类型的集合a.Index_b ...

  6. Oracle自定义数据类型 1

    原文 oracle 自定义类型 type / create type 一 Oracle中的类型 类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nva ...

  7. PL/SQL复合数据类型

    --一.PL/SQL复合数据类型 --(一).PL/SQL记录 --1.定义PL/SQL记录 --(1).定义PL/SQL记录 --Grammar TYPE type_name IS RECORD(f ...

  8. ORACLE数据库数据类型

    Oracle的数据类型 Oracle的数据类型分为标量(Scalar)类型.复合(Composite)类型.引用(Reference)类型和LOB(Large Object)类型4种类型. 因为标量类 ...

  9. golang json转结构体中嵌套多个数组_ElasticSearch第六篇:复合数据类型-数组,对象...

    在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON ...

最新文章

  1. linux 命令行 过滤,利用linux命令行工具进行文本行过滤
  2. pythonlambda内判定_python lambda和列表推导式判断列表中元素中指定值得max
  3. 从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码
  4. 单例模式的特点,懒汉式和饿汉式的区别
  5. SQL2000触发器
  6. 两种方法求解 正数数组中 两个数相减 的最大值
  7. oracle中varchar与varchar2的区别
  8. 【免费毕设】ASP.NET+SQL通用作业批改系统设计(源代码+论文)
  9. 浅谈管道模型(Pipeline)
  10. 一次Linux内核内存泄露实例分析
  11. 【2021/7/19 更新】【梳理】简明操作系统原理 附录一 虚拟内存子系统案例选讲(VAX/VMS + Linux)(docx)
  12. [我教你学]四步解决微软鼠标单击变双击问题
  13. 【MOOC手写体】王文敏教授.《人工智能原理》 第10章 机器学习的任务 Part5 C10.1...
  14. 独家分享《让×××飞》普清640 x 276 迅雷下载 姜文新作
  15. 低维空间到高维空间的映射
  16. LaTex使用技巧10:公式中的各种英文字体
  17. Java/Kotlin 最多保留两位小数处理方法
  18. 微信小程序antv使用详解
  19. matlab版本和yalmip兼容,Yalmip+matlab解决UC机组问题
  20. mac 工作生活常用快捷键

热门文章

  1. python里none什么意思_python中stream=None什么意思?
  2. 简单linux蠕虫,清除Linux系统上的蠕虫程序Ramen
  3. 命名空间不能直接包含_php命名空间
  4. 大连网络推广明确做好网站标题优化对网站排名的提升影响
  5. 如今网络营销行业火爆网络营销外包专员如何做好整合营销?
  6. 网络营销专员浅析网络营销推广基本形式你更中意哪种?
  7. 网站推广——seo优化对企业网站推广能力的提升有着不小的帮助
  8. 浅析网站过度优化的成因应如何规避?
  9. python元类 orm_python-进阶-元类在ORM上的应用详解
  10. python 开发板加密_Bugku 加密 python writeup