版权声明:此博客仅用于学习,讨论,欢迎转载(请注明出处!) 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;