1、%TYPE的使用
2、RECORD的使用
3、%ROWTYPE的使用
--用来简化RECORD的声明,但是也有区别,来个例子看看
--总结一下RECORD,它就像是一张表,只是这张表比较特殊,只能存储一行的数据。
4、PL/SQL表,又叫INDEX BY表
--有,答案就是与RECORD结合起来使用。
5、PL/SQL表与RECORD结合
--直接看一个实际例子
--注意顺序:先声明一种RECORD,再声明一种TABLE,类型为RECORD。
DECLARE
name scott.emp.ename%TYPE;
BEGIN
SELECT ename INTO name FROM emp WHERE empno=7788;
END;
--这种方式声明变量就是让变量的类型完全参考某个表的某个列的类型,与其完全一样。在上面的例子中,name的类型就是跟scott的emp表的ename列的类型完全一样,这样就能够很好的存储从其中select到的值。
2、RECORD的使用
DECLARE
salary number(7,2); --普通的常见变量声明
TYPE emp_record IS RECORD(ename varchar2(20),id number(6)); --此处声明一个类型emp_record,可以发现很像是一张表
e_record emp_record; --e_record的数据类型是emp_record,也就是自定义的类型
BEGIN
e_record.ename := 'FRMH';
e_record.id := 123456;
END;
--RECORD其实就是一种datatype,只是比较特殊而已。从上面的声明方法中可以看到,很像是一张表,但是它只能存储一行数据。
3、%ROWTYPE的使用
--用来简化RECORD的声明,但是也有区别,来个例子看看
DECLARE
e_record scott.emp%ROWTYPE;
BEGIN
SELECT * FROM scott.emp INTO e_record WHERE empno=7788;
END;
--使用TYPE .. IS RECORD();方式可以自由指定其所包含的元素个数,但是使用%ROWTYPE的话,它就会参照emp表建立一个类型,包含emp所包含的列,而不能自己指定个数了。
--总结一下RECORD,它就像是一张表,只是这张表比较特殊,只能存储一行的数据。
4、PL/SQL表,又叫INDEX BY表
DECLARE
TYPE emp_table IS TABLE OF varchar2(20) INDEX BY binary_integer; --声明方式,并且存储的是字符型值
e_table emp_table; --声明e_table是emp_table类型变量
BEGIN
e_table(0) := 'ABNER';
e_table(1) := 'FRMH';
e_table(2) := 'HELLO';
DBMS_OUTPUT.PUTLINE(e_table(0)||e_table(1)||e_table(2));
END;
--可以发现,这种方式,一旦声明的是字符型,那么只能存储字符型的值,很不方便。有没有更好的方法呢?
--有,答案就是与RECORD结合起来使用。
5、PL/SQL表与RECORD结合
--直接看一个实际例子
DECLARE
TYPE emp_record IS RECORD(ename VARCHAR2(25),
job VARCHAR2(10),
sal NUMBER(7,2));
TYPE emp_table IS TABLE OF emp_record INDEX BY binary_integer;
e_table emp_table;
BEGIN
SELECT ename,job,sal INTO e_table(0) FROM scott.emp WHERE empno=7369;
DBMS_OUTPUT.PUTLINE('index 0 : '||emp_table(0).ename);
END;
--有了上面那一些列的铺垫,这个就不用再解释了。
--注意顺序:先声明一种RECORD,再声明一种TABLE,类型为RECORD。