PL/SQL数据类型(三)

 PL/SQL数据类型主要包括标量数据类型和复合数据类型。

标量数据类型比较简单,不在详细说明。

复合数据类型主要包括PL/SQL记录、PL/SQL表(索引表)、嵌套表和变长数组(VARRAY)。下边详细描述。

  1. PL/SQL记录:PL/SQL记录类似于高级语言中的结构,可以存储多个字段值,类似于表中的一行数据。当使用记录变量时,必须先定义记录的结构,然后定义记录类型的变量。定义记录结构的语法:

          TYPE type_name IS RECORD(

                  field_name data_type[[NOT NULL]{:=DEFAULT} value]

                  [, ...]

           );

          示例:自定义PL/SQL记录

DECLARE
     TYPE emp_type IS RECORD(
             empno NUMBER(4),
             ename VARCHAR2(10),
             sal NUMBER(7,2)
     );
     one_emp emp_type;
BEGIN
      SELECT empno,ename,sal INTO one_emp 
      FROM scott.emp where empno=7900;
      DBMS_OUTPUT.PUT_LINE('员工编号为:'||one_emp.empno);
      DBMS_OUTPUT.PUT_LINE('员工姓名为:'||one_emp.ename);
      DBMS_OUTPUT.PUT_LINE('员工工资为:'||one_emp.sal);
END;

    PL/SQL记录的使用方法:在ORACLE9i以前,如果在内嵌sql语句中使用PL/SQL记录变量,那么只有SELECT INTO语句可以直接引用记录变量,而INSERT,UPDATE和DELETE语句则只能引用记录成员。不能直接引用记录变量。从9i开始,不仅可以在select中直接使用记录变量,也可以在INSERT和UPDATE语句中直接引用记录变量。

    (1)在SELECT INTO 中使用PL/SQL记录。既可以使用记录变量,也可以使用记录变量成员。

         示例一:使用记录变量

DECLARE
    TYPE emp_record_type IS RECORD(
            name scott.emp.ename%TYPE,
            sal scott.emp.sal%TYPE,
            dno scott.emp.deptno%TYPE
     );
     emp_record emp_record_type;
BEGIN 
     SELECT ename,sal,deptno INTO emp_record 
     FROM scott.emp WHERE empno=7900;
     DBMS_OUTPUT.PUT_LINE(emp_record.name);
     DBMS_OUTPUT.PUT_LINE(emp_record.sal);
     DBMS_OUTPUT.PUT_LINE(emp_record.dno);
END;

         示例二:使用记录成员变量

DECLARE
    TYPE emp_record_type IS RECORD(
            name scott.emp.ename%TYPE,
            sal scott.emp.sal%TYPE,
            dno scott.emp.deptno%TYPE
     );
     emp_record emp_record_type;
BEGIN 
     SELECT ename,sal,deptno INTO
     emp_record.name,emp_record.sal,emp_record.dno 
     FROM scott.emp WHERE empno=7900;
     DBMS_OUTPUT.PUT_LINE(emp_record.name);
     DBMS_OUTPUT.PUT_LINE(emp_record.sal);
     DBMS_OUTPUT.PUT_LINE(emp_record.dno);
END;

 

       (2)在INSERT 语句中使用PL/SQL记录

          示例一:在VALUES子句中使用记录变量

      

DECLARE
     dept_record scott.dept%ROWTYPE;
BEGIN
     dept_record.deptno:=50;
     dept_record.dname:='adninistrator';
     dept_record.loc:='BJ';
     INSERT INTO scott.dept VALUES dept_record;
END;

 

        示例二:在VALUES子句中使用记录成员

DECLARE
     dept_record scott.dept%ROWTYPE;
BEGIN
     dept_record.deptno:=51;
     dept_record.dname:='sales';
     dept_record.loc:='BJ';
     INSERT INTO scott.dept 
     VALUES
     (dept_record.deptno,dept_record.dname, dept_record.loc);
END;

 

    2.   PL/SQL表(索引表):PL/SQL表也称索引表,用于处理PL/SQL数组的数据类型。但是索引表与高级语言的数组是有区别的:高级语言数组的元素个数是有限制的,并且下标不能为负值;而索引表的元素个数没有限制,并且下标可以为负值。定义索引表的语法:

     TYPE type_name IS TABLE OF element_type

     [NOT NULL] INDEX BY key_type;

     identifier type_name;

    其中索引表下标不仅可以使用BINARY_INTEGER和PLS_INTEGER,而且可以使用VARCHAR2。

    示例一:在索引表中使用BINARY_INTEGER和PLS_INTEGER

DECLARE 
     TYPE ename_table_type IS TABLE OF scott.emp.ename%TYPE
     INDEX BY BINARY_INTEGER;
     ename_table ename_table_type;
BEGIN
     SELECT ename INTO ename_table(-1) FROM scott.emp
     WHERE empno=7900;
     DBMS_OUTPUT.PUT_LINE(ename_table(-1));
END;

  3.  嵌套表:也是一种用于处理PL/SQL数组的数据类型。同样嵌套表和高级语言的数组也是有区别的:高级语言数组的元素下标从0或者1开始,并且元素个数是有限制的;而嵌套表的元素下标从1开始,并且元素个数没有限制;另外,高级语言的数组元素是有顺序的,而嵌套表中的数组元素可以是无序的。索引包类型不能作为表列的数组类型使用,但是嵌套表类型是可以作为表列的数组类型使用的。当使用嵌套表之前,必须首先使用起构造方法初始化嵌套表。定义嵌套表的语法格式:

     TYPE type_name IS TABLE OF element_type;

     identifier type_name;

示例一;在PL/SQL块中使用嵌套表

DECLARE
       TYPE ename_table_type IS TABLE OF scott.emp.ename%TYPE;
       ename_table ename_table_type;
BEGIN
       ename_table:=ename_table_type('mary','lili','tomm');
       SELECT ename INTO ename_table(2) FROM scott.emp
       WHERE empno=7900;
       dbms_output.put_line(ename_table(2));
END;

 4.  变长数组(VARRAY):也是一种用于处理PL/SQL数组的数据类型,它也可以作为表列的数据类型使用。该数据类型与高级语言数组非常相似,起元素下标从1开始,并且元素的最大个数是又限制的。定义语法:

   TYPE type_name IS VARRAY(size) OF element_type [NOT NULL];

   identifier type_name;

5.  PL/SQL记录表:PL/SQL变量用于处理单行单列数据,PL/SQL记录用于处理单行多列数据,PL/SQL集合用户处理多行多列数据。为了在PL/SQL块中处理多行多列数据,我们可以使用记录表。PL/SQL记录表结合了PL/SQL记录和PL/SQL集合的优点,从而可以有效处理多行多列的数据。

    示例:

DECLARE 
     TYPE emp_table_type IS TABLE OF scott.emp%ROWTYPE
      INDEX BY BINARY_INTEGER;
      emp_table emp_table_type;
BEGIN
      SELECT * INTO emp_table(1) FROM scott.emp
      WHERE empno=7900;
      dbms_output.put_line(emp_table(1).ename);
END;

你可能感兴趣的:(数据结构,sql)