PL/SQL学习二

来源:互联网 发布:2016com域名注册 促销 编辑:程序博客网 时间:2024/05/07 10:49
6、%TYPE用法
   当使用%TYPE属性来定义变量的时候,它会安装数据库的列属性或其他变量的属性来确定你当前定义的新变量的类型和长度。
   如:
   v_sal emp.sal%TYPE;
   表示v_sal变量与表emp的列sal属性一样(长度和类型都一致)。
  
7、复合变量
   复合变量是指用于存放多个值的类型。主要有四种:
   7.1、PL/SQL RECORD(记录类型)
   类似于C中的结构体变量。
-- ex:pl/sql_8DECLARE  --匿名块  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_typeCREATE 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_testinsert 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表已创建


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