6、%TYPE用法
当使用%TYPE属性来定义变量的时候,它会安装数据库的列属性或其他变量的属性来确定你当前定义的新变量的类型和长度。
如:
v_sal emp.sal%TYPE;
表示v_sal变量与表emp的列sal属性一样(长度和类型都一致)。
7、复合变量
复合变量是指用于存放多个值的类型。主要有四种:
7.1、PL/SQL RECORD(记录类型)
类似于C中的结构体变量。
-- ex:pl/sql_8
DECLARE
--匿名块
TYPE EMP_RECORD_TYPE IS RECORD( --定义记录类型
NAME ORDER.BILLTYPENAME%TYPE, --注意是逗号
V_SAL STOER.NUM%TYPE,
V_BILLID ORDERDETAIL.BILLID%TYPE);
V_EMP_RECORD EMP_RECORD_TYPE; --定义记录变量
BEGIN
--分别给记录变量内的各个变量赋值,也可以一起赋值(先select出来再into)
SELECT BILLTYPENAME
INTO V_EMP_RECORD.NAME
FROM ORDER
WHERE ROWNUM = 1;
SELECT NUM
INTO V_EMP_RECORD.V_SAL
FROM STOER
WHERE ROWNUM = 1;
SELECT BILLID
INTO V_EMP_RECORD.V_BILLID
FROM ORDERDETAIL
WHERE ROWNUM = 1;
--输出
DBMS_OUTPUT.PUT_LINE('name:' || V_EMP_RECORD.NAME);
DBMS_OUTPUT.PUT_LINE('sal:' || V_EMP_RECORD.V_SAL);
DBMS_OUTPUT.PUT_LINE('billid:' || V_EMP_RECORD.V_BILLID);
--异常处理
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error!');
END;
PS:建议PL/SQL编程应养成良好的习惯,声明、BEGIN/END、异常处理块都应当有才完整(虽然声明和异常处理不是必须的)。
7.2、PL/SQL 表(TABLE)
类似于C中的数组,不同的是PL/SQL的表类型下标可以为负数和字符串,而且其元素个数没有限制。
-- ex:pl/sql_9
DECLARE
-- 定义表类型及表类型变量,下标为整型
TYPE V_TABLE_TYPE IS TABLE OF T_BILLLIST.BILLTYPENAME%TYPE
INDEX BY BINARY_INTEGER;
V_TABLE V_TABLE_TYPE;
BEGIN
--给表类型中下标为-3的变量赋值
SELECT BILLTYPENAME
INTO V_TABLE(-3)
FROM T_BILLLIST
WHERE ROWNUM = 1;
--输出
DBMS_OUTPUT.PUT_LINE('name:' || V_TABLE(-3));
--异常处理
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error!');
END;
7.3、嵌套表(Nested Table)
也类似于C中的数组,嵌套表下标不能为负数,但其元素个数没有限制。
嵌套表也可以作为表列的数据类型(PL/SQL表不可以)。
创建嵌套表类型:
-- 创建类型em_type
CREATE OR REPLACE TYPE EM_TYPE AS OBJECT
(
NAME VARCHAR2(20),
SALARY NUMBER(22, 4),
HIREDATE DATE
)
-- 创建嵌套表(表列为类型EM_TYPE)
CREATE OR REPLACE TYPE EMP_ARRAY IS TABLE OF EM_TYPE;
注意在使用嵌套表类型的时候,必须要为其指定专门的存储表。
-- 嵌套表的存储表
CREATE TABLE em_test(
deptno NUMBER(2),
dname VARCHAR2(10),
employee emp_array -- 嵌套表类型做表列
)NESTED TABLE employee STORE AS test_nest;
其中test_nest就是嵌套表类型的存储表。它也是作为表类型存储(如图),但是它不能用select查询。
SQL> select * from test_nest;
select * from test_nest
*
第 1 行出现错误:
ORA-22812: 无法参考嵌套表列的存储表
--插入数据到em_test
insert into em_test values(1,'c001',emp_array(em_type('cry',22.234,sysdate)));
--查询嵌套表列
SELECT * FROM TABLE (SELECT EMPLOYEE FROM EM_TEST);
7.4、VARRAY(变长数组)
类似于嵌套表,但VARRAY的元素个数是有限制的。
创建变长数组(VARRAY)如下:
SQL> CREATE TYPE tmp_type AS OBJECT(
2 title VARCHAR2(30),
3 pDate DATE);
4 /
类型已创建。
SQL> CREATE TYPE tmp_array IS VARRAY(20) OF tmp_type;
2 /
类型已创建。
SQL> CREATE TABLE author(
2 ID NUMBER(8),
3 NAME VARCHAR2(20),
4 article tmp_array); -- 变长数组类型article
表已创建
注意变长数组不需为其指定专门的存储表。