文档章节

oracle集合与记录

海贼爱音乐
 海贼爱音乐
发布于 2017/08/18 14:15
字数 843
阅读 21
收藏 0
点赞 0
评论 0
  1. 集合。集合是相同类型元素的组合。数据库中相当于"多行单列", 类似于数组, 使用唯一的下标来标识其中的每个元素

In a collection, the internal components always have the same data type, and are called elements. You can access each element of a collection variable by its unique index, with this syntax: variable_name(index). To create a collection variable, you either define a collection type and then create a variable of that type or use %TYPE.

关联数组(索引表)Associative array(or index-by table),下标无限制,可以为负数,元素个数无限制

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;
type_name:用户自定义数据类型的名字
element_type:索引表中元素类型
key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)

declare
 --显式游标
 cursor cur_dept is
   select department_name from departments where rownum < 6;
 --关联数组
 type type_dept is table of departments.department_name%type index by pls_integer;
 v_dept type_dept;
 i      pls_integer := 0;
begin
 for c in cur_dept loop
   i := i + 1;
   v_dept(i) := c.department_name;
   dbms_output.put_line('插入' || v_dept(i));
 end loop;
end;

嵌套表(Nested table),下标从1开始,通过构造器初始化,大小可以自动增长。用extend方法可以扩展元素个数

DECLARE
 CURSOR cur_dept IS
   SELECT department_name FROM departments WHERE ROWNUM < 6;
 TYPE type_dept IS TABLE OF departments.department_name%TYPE;
 --构造器,可以无参也可带参
 v_dept type_dept := type_dept();
 i      PLS_INTEGER := 0;
BEGIN
 FOR c IN cur_dept LOOP
   --extend方法
   v_dept.extend;
   i := i + 1;
   v_dept(i) := c.department_name;
   dbms_output.put_line('插入' || v_dept(i));
 END LOOP;
 --据说v_dept.first..v_dept.last这种方式不好当数据出现null值时。
 --first/last方法返回集合上下标,count方法返回集合个数。
 FOR j IN 1 .. v_dept.count LOOP
   dbms_output.put_line('展示' || v_dept(j));
 END LOOP;
END;

变长数组VARRAY(variable-size array),元素之间是紧密排列,通过构造器初始化,元素有序排列。

type type_name IS {varray|varying array}(maxinum_size) OF element_type[not null];
type_name:可变数组的类型名
maxinum_size:可变数组元素个数的最大值
element_type:数组元素的类型

DECLARE
  TYPE type_var IS VARRAY(10) OF INT;
  v_var type_var := type_var();
BEGIN
  --dbms_output.put_line(varr.count);  
  FOR i IN 1 .. 5 LOOP
    v_var.extend;
    v_var(i) := i + 1;
  END LOOP;

  FOR i IN 1 .. 5 LOOP
    dbms_output.put_line(v_var(i));
  END LOOP;
END;
  • 区别
    输入图片说明
  1. 记录。单行多列的标量构成的复合结构。可以看做是一种用户自定义数据类型。组成类似于多维数组。将一个或多个标量封装成一个对象进行操作。是一种临时复合对象类型。 记录可以直接赋值。RECORD1 :=RECORD2; 记录不可以整体比较。 记录不可以整体判断为空。

In a record, the internal components can have different data types, and are called fields. You can access each field of a record variable by its name, with this syntax: variable_name.field_name. To create a record variable, you either define a RECORD type and then create a variable of that type or use %ROWTYPE or %TYPE.

declare
  type rec_emp is record(
    v_city     locations.city%type,
    v_deptname departments.department_name%type);
  rec1 rec_emp;
  rec2 rec_emp;
begin
  SELECT loc.CITY, dept.DEPARTMENT_NAME
    INTO rec1
    FROM LOCATIONS loc, departments dept
   where loc.LOCATION_ID = dept.LOCATION_ID
     and dept.DEPARTMENT_ID = 20;
  SELECT loc.CITY, dept.DEPARTMENT_NAME
    INTO rec2
    FROM LOCATIONS loc, departments dept
   where loc.LOCATION_ID = dept.LOCATION_ID
     and dept.DEPARTMENT_ID = 30;
  DBMS_OUTPUT.put_line(rec1.v_city || '---' || rec1.v_deptname);
  DBMS_OUTPUT.put_line(rec2.v_city || '---' || rec2.v_deptname);
end;
DECLARE
  v_dept departments%rowtype;
BEGIN
  SELECT * INTO v_dept FROM departments WHERE department_id = 30;
  dbms_output.put_line(v_dept.department_name || v_dept.manager_id);
END;

3.多行多列用记录+集合。

declare
  type rec_dept is record(
    v_id   departments.department_id%type,
    v_name departments.department_name%type,
    v_city locations.city%type);
  type coll_dept is table of rec_dept index by pls_integer;
  v_dept coll_dept;
  i      pls_integer := 1;
begin
  for j in (select dept.department_id,dept.department_name,loc.city from
    departments dept,locations loc where dept.location_id=loc.location_id
    and dept.department_id<50) loop
    v_dept(i) := j;
    i := i + 1;
  end loop;
  for k in 1 .. v_dept.count loop
    dbms_output.put_line(v_dept(k).v_id || v_dept(k).v_name || v_dept(k).v_city);
  end loop;
end;

© 著作权归作者所有

共有 人打赏支持
海贼爱音乐
粉丝 1
博文 87
码字总数 22611
作品 0
广州
CEO
Oracle 查询效率 谨慎选择

Oracle有很多值得学习的地方,通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。假如有column没有被索引,查...

梁佳
2012/08/26
0
0
Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)

在我前面很多篇关于框架设计和介绍的文章里面,大多数都是利用框架提供的基础性API进行各种的操作,包括增删改查、分页等各种实现和其衍生的实现,而这些实现绝大多数是基于SQL的标准操作实现...

walb呀
2017/12/04
0
0
oracle sql 优化(三)

(23) 用>=替代> 高效: SELECT FROM EMP WHERE DEPTNO >=4 低效: SELECT FROM EMP WHERE DEPTNO >3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的......

等待救赎
2016/03/02
26
0
Bulk Binds (BULK COLLECT & FORALL) and Record Proc

Bulk Binds (BULK COLLECT & FORALL) and Record Proc 码蜂笔记2017-09-029 阅读 数据库oracle 引言 Oracle 使用两种引擎来处理 PL/SQL 代码。所有存储过程的代码由 PL/SQL 引擎处理,所有的...

码蜂笔记
2017/09/02
0
0
SQL优化34条(二)

(17) 用索引提高效率: 索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语...

老枪
2010/03/12
444
0
Mybatis结合Oracle的foreach insert批量插入报错!

最近做一个批量导入的需求,将多条记录批量插入数据库中。解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的for...

GreatQing
2016/08/25
836
0
Oracle Database and Instance简介

Oracle Database and Instance简介 Database:由一系列存放在磁盘上的文件构成,这些文件用于储存数据。 Database instance:由一系列管理database文件的内存结构组成,包括一个名为system gl...

LiJIaming
2012/05/11
0
0
Oracle Data Integrator 介绍

本文介绍了 Oracle Data Integrator,它是一个基于 Java 的中间件,可以使用数据库在 SOA 中执行基于集合的数据集成任务。 现在,复杂的“可热插拔”系统和面向服务的体系结构 (SOA) 得到了广...

mj4738
2013/03/21
0
0
solr与关系型数据库整合

oracle数据库里记录越来越多,模糊查询越来越慢,所以想用solr来做全文检索,比如要检索单据,但是单据和好几张表关联,用solr无法实现关系型数据库的表连接。 我们现在想到的做法是将要检索...

一个人混
2016/04/16
140
1
oracle pl/sql(二)

2014-04-14 1.标量变量:用于存放单行单列的数据 2.复合数据类型 1)PL/SQL记录:处理单行多列数据 2)PL/SQL集合:用于处理多行单列数据 AA:索引表(Associative arrays, also known as index...

蓝蝶飞扬
2014/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部