PL/SQL学习二(复合变量)

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
表已创建


   注意变长数组不需为其指定专门的存储表。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值