%type、%rowtype,varry、record、table 的使用详解

版权声明:此博客仅用于学习,讨论,欢迎转载(请注明出处!) https://blog.csdn.net/qq_34745941/article/details/81368648

0、基础数据准备

CREATE TABLE stu(
  ID NUMBER(3) PRIMARY KEY,
  xm NVARCHAR2(30)
)
INSERT INTO stu(ID, xm) VALUES(1, '小游子');
INSERT INTO stu(ID, xm) VALUES(2, '小倩子');

1、基础数据类型定义

1.1 %type

单条记录的数据类型定义

v_id System.stu.id%type; 

好处:若 id 字段类型改变,v_id 字段类型也会自动跟着改变

1.2 %rowtype

所有记录的数据类型定义

v_row System.stu%rowtype;

好处:v_row 中所有的字段类型始终与 stu 表中的字段那类型保持一致。

1.3 record

%type 是声明 单条记录的数据类型,%rowtype 是声明 所有记录的数据类型,如果想 声明多个数据类型(但不是 所有数据类型),该怎么办了?此时就用 record

DECLARE
        TYPE type_stu_record IS RECORD(
             v_id system.stu.id%TYPE,
             v_xm system.stu.xm%TYPE
        );
        v_stu_record type_stu_record;
  BEGIN
        SELECT t.id,         -- 类型,个数都必须与声明时,保持一致
               t.xm
          INTO v_stu_record 
          FROM stu t
         WHERE ROWNUM = 1;   -- 如果想 赋值多条记录,请看 集合数据类型定义
        dbms_output.put_line(v_stu_record.v_id ||' : '||v_stu_record.v_xm);
EXCEPTION WHEN OTHERS THEN
          dbms_output.put_line(Sqlerrm);
    END;

1、集合数据类型定义

基本数据类型,select into 时,只能一条条插入记录
集合数据类型,可使用 select bulk collect into 一次性插入所有数据

1.1 varry

指定长度的数组,下标从 1 开始。遍历输出所有项

type 数组名 varray(size) of 元素类型 [not null];

size : 数组长度,必填项。

DECLARE 
          TYPE type_var_stu IS VARRAY(4) OF VARCHAR2(30);
         v_arr type_var_stu;
  BEGIN
         v_arr := type_var_stu('a','b','c','d');
         dbms_output.put_line('输出第一个:'||v_arr(3));
         v_arr(3) := 'dd';    -- 下标3,必须已存在值,否则报错。
         dbms_output.put_line('输出第三个:'||v_arr(3));

           FOR v_index IN v_arr.first .. v_arr.last LOOP 
               -- 循环遍历数组
               dbms_output.put_line(v_arr(v_index));
           END LOOP;
EXCEPTION WHEN OTHERS THEN
          dbms_output.put_line(sqlerrm);
    END;

1.2 table

type table_name is table of element_type[not null]
index by [binary_integer|pls_integer|varray2];

index by : 创建一个主键索引,以便引用记录表变量中的特定行。
binary_integer : 下标自增(无需‘初始化’)

1.3.1 存储单行单列

DECLARE
        TYPE type_table_stu IS TABLE OF VARCHAR2(30)
       INDEX BY BINARY_INTEGER;

        v_t  type_table_stu;
  BEGIN
        v_t(1) := '1';
        v_t(2) := '2';
        v_t(3) := '3';

        dbms_output.put_line('输出第一个: '||v_t(1));
EXCEPTION WHEN OTHERS THEN
          dbms_output.put_line(Sqlerrm);
    END;

1.3.2 存储多行多列与rowtype联用

要插入的列与表数据类型完全一致

DECLARE 
        TYPE type_table_stu IS TABLE OF system.stu%ROWTYPE;
        v_stu type_table_stu;
  BEGIN
        SELECT t.id,    -- 插入的值,个数、类型 都必须和声明时完全一致。
               t.xm
          BULK COLLECT  -- 一次性提取数据至集合内
          INTO v_stu
          FROM stu t;

           FOR v_index IN v_stu.first .. v_stu.last LOOP
              dbms_output.put_line(v_stu(v_index).id||' : '||v_stu(v_index).xm);
          END LOOP;

EXCEPTION WHEN OTHERS THEN 
          dbms_output.put_line(Sqlerrm);
    END;

1.3.3 存储多行多列与record联用

DECLARE 
        TYPE type_record_stu IS RECORD( 
             v_id system.stu.id%TYPE,
             v_xm system.stu.xm%TYPE
        );
        TYPE type_table_stu IS TABLE OF type_record_stu; -- 将记录作为 table 的数据类型
        v_stu type_table_stu;
  BEGIN
        SELECT t.id,
               t.xm
          BULK COLLECT
          INTO v_stu
          FROM stu t;

            FOR v_index IN v_stu.first .. v_stu.last LOOP
                dbms_output.put_line(v_stu(v_index).v_id||' : '||v_stu(v_index).v_xm);
            END LOOP;

EXCEPTION WHEN OTHERS THEN 
          dbms_output.put_line(Sqlerrm);
    END;

猜你喜欢

转载自blog.csdn.net/qq_34745941/article/details/81368648
今日推荐