• Oracle(00):PL/SQL复合类型


    一、PL/SQL记录:一条记录。

    可简化单行多列的数据的处理。当使用pl/sql记录时,应用开发人员即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量。

    1、当使用自定义的pl/sql记录时,需要分别定义pl/sql记录类型和记录变量。

    declare 
    type emp_record_type is record(
          name emp.ename%type,salary emp.sal%type
          );
                emp_record emp_record_type;
    begin
    select ename,sal into emp_record from emp where empno=&no;
    dbms_output.put_line('雇员名:'||emp_record.name);
    dbms_output.put_line('雇员工资:'||emp_record.salary);
    end;

    2、使用%rowtype 属性定义记录变量

    declare 
    emp_record emp%rowtype;
    begin 
    select * into emp_record from emp where empno=&no;
    dbms_output.put_line('姓名: '||emp_record.ename);
    dbms_output.put_line('工资: '||emp_record.sal);
    end;

    二、PL/SQL表:一列数据。

    用于处理单列多行数据。类似于一维数组。PL/SQL表的元素个数没有限制,且下表可为负数。

    语法如下:

    type 表类型  is table of  类型 
    index by binary_integer; 表变量名 表类型;
    index by binary_integer 子句代表以符号整数为索引,访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。可以不按顺序赋值,但必须先赋值后使用。

    1、使用PL/SQL表处理单列单行数据。

    declare 
    type ename_table_type is table of emp.ename%type
    index by binary_integer;
    ename_table ename_table_type;
    begin
    select ename into ename_table(1) from emp where empno=&eno;
    dbms_output.put_line('雇员名: '||ename_table(1));
    end;

    2、使用PL/SQL表处理单列多行数据。

    declare
    type ename_table_type is table of emp.ename%type
    index by binary_integer;
    ename_table ename_table_type;
    begin 
    select ename bulk collect into ename_table from emp
    where deptno=&dno;
    for i in 1..ename_table.count loop
    dbms_output.put_line('雇员名: '||ename_table(i));
    end loop;
    end;

    三、PL/SQL记录表:多列多行表

    用于处理多行多列数据。类似于多维数组。

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

    TYPE table_name IS TABLE OF element_type [NOT NULL] 
    INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];

    记录表中的方法:

    • EXISTS(n):如果集合的第n个成员存在,则返回true
    • COUNT:返回已经分配了存储空间即赋值了的成员数量
    • FIRST:返回成员的最低下标值
    • LAST:返回成员的最高下标值
    • PRIOR(n):返回下标为n的成员的前一个成员的下标。如果没有则返回NULL
    • NEXT(N):返回下标为n的成员的后一个成员的下标。如果没有则返回NULL
    • TRIM:删除末尾一个成员
    • TRIM(n) :删除末尾n个成员
    • DELETE:删除所有成员
    • DELETE(n) :删除第n个成员
    • DELETE(m, n) :删除从n到m的成员
    • EXTEND:添加一个null成员
    • EXTEND(n):添加n个null成员
    • EXTEND(n,i):添加n个成员,其值与第i个成员相同
    • LIMIT:返回在varray类型变量中出现的最高下标值

    例1:

    declare 
    type emp_table_type is table of emp%rowtype
    index by binary_integer;
    emp_table emp_table_type;
    begin
    select * bulk collect into emp_table from emp where deptno=&dno;
    for i in 1..emp_table.count loop
    dbms_output.put_line('雇员名: '||emp_table(i).ename||',工资: '||emp_table(i).sal);
    end loop;
    end;

    按一维数组使用表:

    DECLARE
    --定义记录表数据类型
       TYPE reg_table_type IS TABLE OF varchar2(25)
       INDEX BY BINARY_INTEGER;
    --声明记录表数据类型的变量
       v_reg_table REG_TABLE_TYPE;
        
    BEGIN
       v_reg_table(1) := 'Europe';
       v_reg_table(2) := 'Americas';
       v_reg_table(3) := 'Asia';
       v_reg_table(4) := 'Middle East and Africa';
       v_reg_table(5) := 'NULL';
     
       DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_table (1)||''       ||v_reg_table (2)||''      ||v_reg_table (3)||''      ||v_reg_table (4));
       DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_table(5));
    END;

    四、varry数据类型:数组

    具有相同数据类型的一组成员的集合,每个成员都有一个唯一的下标。

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

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

    VARRAY的使用举例:

    DECLARE
    --定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
       TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);
    --声明一个该VARRAY数据类型的变量
       v_reg_varray REG_VARRAY_TYPE;
    
    BEGIN
    --用构造函数语法赋予初值
       v_reg_varray := reg_varray_type
             ('中国', '美国', '英国', '日本', '法国');
    
       DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||''
                                        ||v_reg_varray(2)||''
                                        ||v_reg_varray(3)||''
                                        ||v_reg_varray(4));
       DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));
    --用构造函数语法赋予初值后就可以这样对成员赋值
       v_reg_varray(5) := '法国';
       DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));
    END;
  • 相关阅读:
    mysql 实战 or、in与union all 的查询效率
    转:手机流畅的决定性因素
    合批只是对CPU的优化,与GPU没有任何关系
    UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新
    RGB ECT 4BIT 压缩后质量远高于RGB ETC2 4BIT
    Adreno GPU Profiler
    UNITY2018.3 在editor下运行时new memoryprofiler显示 shader占用内存很大的问题在安卓上并没有看到
    VS2017断点调试UNITY2018.3 经常卡住的问题
    一次UNITY闪退问题的定位心得
    UNITY2018 真机开启deepprofiling的操作
  • 原文地址:https://www.cnblogs.com/springsnow/p/9394918.html
Copyright © 2020-2023  润新知