您现在的位置是:首页 > 正文

使用复合数据类型

2024-02-29 16:49:04阅读 0

使用复合数据类型

(一)PL/SQL 记录

标量变量只能处理单行单列的数据,而PL/SQL记录用于处理单行多列的数据。

①自定义记录类型和记录变量

  • 自定义记录类型

语法:

TYPE type_name IS RECORD(

field datatype [[not null] <default | :=> <expression>]

[,......] );

  • 定义记录变量

语法:

identifier type_name;

 

②使用%ROWRYPE属性直接定义记录变量

语法:|-identifier table_name%ROWTYPE;

         |-identifier view_name%ROWTYPE;

 

注:当使用%ROWTYPE属性定义记录变量时,记录成员个数、名称、类型与表或视图列的个数、名称、类型完全相同。

说明:当引用记录成员时,必须在成员名之前加记录变量名作为前缀。从ORACLE9i开始,用户可以在SELECT...INTO... 、INSERT、UPDATE语句中使用记录变量或记录成员。但用户只能在DELETE的WHERE子句中使用记录成员。

 

例1:在SELECT...INTO...语句中使用记录变量

declare
    type v_record is record(
    v_no dept.dname%type,
    v_name dept.dname%type,
    v_loc dept.loc%type);
    v v_record;
begin
    select *  into  from dept where deptno=10;
    dbms_output.put_line(v.v_name);
end;

输出:ACCOUNTING


例2:在SELECT...INTO...语句中使用记录成员

declare
    type v_record is record(
    v_no dept.dname%type,
    v_name dept.dname%type,
    v_loc dept.loc%type);
    v v_record;
begin
    select *  into v. v_no,v. v_name,v.v_loc from dept where deptno=10;
    dbms_output.put_line(v.v_loc);
end;

输出:NEW YORK

例3:在VALUES子句中使用记录变量

declare
    v v_dept%ROWTYPE;
begin
    select * into v from dept where deptno=10;
    insert into v_dept values v;
end;

例4:在VALUES子句中使用记录成员

declare
    v v_dept%ROWTYPE;
begin
    select loc,dname,deptno into v.loc,v.dname,v.deptno from dept where deptno=20;
    insert into v_dept values (v.deptno,v.dname,v.loc);
end;  

 

例5:在UPDATE语句中使用记录变量

declare
    v v_dept%rowtype;
begin
    select * into v from v_dept where deptno=10; 
    update v_dept set row=v where deptno=20;
end;

 

例6:在UPDATE语句中使用记录成员

declare
    v dept%rowtype;
begin
    v.deptno:=40;
    update v_dept set deptno=v.deptno where deptno=20;
end;

 

例7:在DELETE语句中使用记录成员

declare
    v dept%rowtype;
begin
    v.deptno:=40;
    delete from v_dept where deptno=v.deptno;
end;

(二) PL/SQL集合

标量变量,处理单行单列数据。PL/SQL记录,处理单行多列数据。PL/SQL集合,处理单列多行数据。

①索引表

特点:索引表的下标不仅可以为负值,而且其元素个数没有限制。注:索引表类型不能作为表列的数据类型使用。

  •  定义索引表的语法:

TYPE  type_name  IS  TABLE OF element_type [not null]  INDEX BY key_type;

其中:

①element_type :用于指定索引表元素的数据类型。

②key_type:用于指定索引表元素下标的数据类型(BINARY_INTEGER、PLS_INTEGER、VARCHAR2)。

③NOT NUL:表示不允许引用NULL元素,即是否允许索引表元素值为空。

  • 定义索引表变量

identifier type_name;

 

例1:

declare
     type a_index is table of varchar2(20)
         index by binary_integer;
     a a_index;
     cursor b_cursor is select dname from dept;
begin
    open  b_cursor;
    for i in -1..2
       loop
          fetch b_cursor into a(i);
    end loop;
    close b_cursor;
    for i in reverse -1..2
       loop
       dbms_output.put_line(a(i));
   end loop;
   dbms_output.put_line(a.first);
end;    

 输出结果:

OPERATIONS
SALES
RESEARCH
ACCOUNTING
-1

 例2:  使用FIRST、LAST方法

declare
    type b_index is table of varchar2(20) index by varchar2(20);
    b b_index;
begin
    b('beijing'):='北京';
    b('aaa'):='阿富汗';
    b('shanghai'):='上海';
    b('guangzhou'):='广州';
    dbms_output.put_line(b.first);
    dbms_output.put_line(b.last);
end;

输出:

aaa
shanghai

②嵌套表

特点:嵌套表的元素下标从1开始,并且元素个数没有限制。注:嵌套表类型可以作为表列的数据类型使用。

  • 定义嵌套表的语法

TYEP tyep_name IS TABLE OF element_tyep;

  • 定义嵌套表变量

identifier type_name;

其中:element_type:用于指定嵌套表元素的数据类型

 

注:当使用嵌套表元素时,必须首先使用其构造方法初始化嵌套表。目的是指定嵌套表变量的元素个数和元素默认值。

例1:在PL/SQL块中使用嵌套表

declare
    type a_table is table of varchar2(20);
    a a_table;
begin
    a:=a_table('a','b','c');
    select  dname into a(2) from dept where deptno=&n;
    DBMS_OUTPUT.put_line(A(1)||A(2)||A(3));
END;
输出:aACCOUNTINGc

 

 

 

 

 

 

⑥ 集合方法

1、FIRST、LAST:用于返回集合变量第一个、最后一个元素的下标。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

网站文章

  • Linux进程控制编程

    一 进程控制理论基础 进程的状态: 进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元; 程序是放到磁盘的可执行文件; 进程是指程序执行的实例;进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制 进程是暂时的,程序使长久的:进程是一个状态变化的过程,程序可长久保存 进程

    2024-02-29 16:48:57
  • Unity 新的输入系统Input System(二)

    Unity 新的输入系统Input System(二)

    前面一篇大致简单的介绍了下Input System,并且通过官方的 SimpleDemo_UsingPlayerInput 来了解了PlayerInput组件的使用。接下来让我们通过其他几个Demo来...

    2024-02-29 16:48:50
  • NFS搭建、配置及故障排除详解

    1.什么是NFS?NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地N...

    2024-02-29 16:48:24
  • 【并查集 | Python】1631. 最小体力消耗路径

    【并查集 | Python】1631. 最小体力消耗路径

    1631. 最小体力消耗路径题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/path-with-minimum-effort/题目你准备参加一场远足...

    2024-02-29 16:48:17
  • Android的资源引用

    Android的资源引用

    Android中字符串、颜色和尺寸应用1.资源列表2.xml文件二、Android项目布局文件

    2024-02-29 16:48:09
  • Mac 安装 brew(最新教程,绝对可行,一行代码搞定,不报错)

    Mac 安装 brew(最新教程,绝对可行,一行代码搞定,不报错)

    参考:https://www.cnblogs.com/liyihua/p/12753163.html现在安装brew,一会报这个错,一会儿报那个错,上网查了很多教程,用了很多时间都是不可以,电脑开VP...

    2024-02-29 16:47:40
  • LeetCode每日一练——搜索插入位置

    二分查找法

    2024-02-29 16:47:33
  • 快速解决java中的容器

    快速解决java中的容器

    首先已知java中任何类都有一个共同的父类,那就是Object类。若定义一个Object类数组,理论上可以涵盖任何类的数据。例如:public static void main(String[] ar...

    2024-02-29 16:47:25
  • JavaScript中的负无穷大是什么?

    JavaScript中的负无穷大是什么?

    在JavaScript编程中,负无穷大是一个特殊的数值,表示比任何负数都小的数。总结一下,JavaScript中的负无穷大是一个特殊的数值,用于表示比任何负数都小的值。需要注意的是,在JavaScri...

    2024-02-29 16:46:57
  • 产品经理<技术术语>

    产品经理<技术术语>

    在产品落地过程中,需要及时发现并解决产品的技术问题,了解技术术语可以帮助产品经理更加敏锐地发现技术风险,并有针对性地制定应对措施,降低项目风险。HTML是用于构建网站和Web页面的标准语言,用于定义页...

    2024-02-29 16:46:50