--引用类型
--%type
--定义某个变量的数据类型与已存在的变量数据类型,某个列的数据类型相同。
--注意:%type前面必须加表名.字段名
declare
v_empno emp.empno%type; --定义v_empno的类型跟emp表中的empno字段类型一致
v_ename emp.ename%type;
begin
select empno,ename into v_empno,v_ename from emp where empno = '&id';
dbms_output.put_line('empno:'||v_empno);
dbms_output.put_line('ename:'||v_ename);
end;
select * from emp;
--%rowtype
--用于定义不确定的类型的变量,%rowtype可以理解成对数据库记录一行提取出来的一个副本。
--注意:%rowtype之前必须有前缀(表名)
declare
v_emp emp%rowtype; --v_emp表示的是保存emp表中的一行的记录
--%rowtype里面的值不能一次性提取出来,只能一个一个提取
begin
select * into v_emp from emp where empno ='&id';
--打印员工信息
dbms_output.put_line('empno:'||v_emp.empno);
dbms_output.put_line('ename:'||v_emp.ename);
dbms_output.put_line('sal:'||v_emp.sal);
end;
--复合数据类型
--可变数组 :一旦确定长度,则下标也确定
--可变数组的元素下标从1开始
--定义可变数组类型的语法:
-- type 可变数组名 is varray(数组的长度) of 元素类型
declare
--定义一个可变数组类型
--定义一个元素是varchar2(10)的长度为5的可变数组 strings
type strings is varray(5) of varchar2(10);
--如果要使用可变数组,那就必须再定义一个变量指向这个可变数组
v_list strings := strings('scott','suke','lily','kobe','allen');
begin
--打印可变数组中的值
dbms_output.put_line(v_list(1));
dbms_output.put_line(v_list(2));
dbms_output.put_line(v_list(3));
dbms_output.put_line(v_list(4));
dbms_output.put_line(v_list(5));
--dbms_output.put_line(v_list(6));--下标越界
end;
--table
--是可以在PL/SQL程序中引用,能够模仿数组的非永久表。
--语法:type 名称 is table of 元素类型
-- [index by binary_integer] --下标是无限的,按照二进制进行索引
declare
type strs is table of varchar2(10)
index by binary_integer;
--定义的table不能直接使用,必须用另外一个变量引用
v_list strs;
begin
v_list(1):='hello';
v_list(999999) :='world';
v_list(2) := 'Oracle';
dbms_output.put_line(v_list(1)||v_list(999999)||v_list(2));
end;
--注意:table与可变数组的区别:
--1.table和可变数组的结构是非常相似的
--2.可变数组变量的长度一旦确定下来,以后就无法增加。table变量的长度将一直可变,而且下标可以不连续。
--record类型
--包含一个或者几个组件,每个组件称为一个filed(域),
--域的数据类型可以任意变量或者数据类型
--我们可以把record理解成Java中的集合对象
--语法: type record名 is record
-- (
-- 变量1 数据类型,
-- 变量2 数据类型,
-- ......
-- )
declare
--声明一个对象,类型是record
type v_record is record(
id number,
name emp.ename%type
);
v_emp v_record;
begin
select empno,ename
into v_emp.id,v_emp.name
from emp
where empno=7369;
dbms_output.put_line(v_emp.id||v_emp.name);
end;