11.1.2  在SELECT语句中使用记录
1.使用%ROWTYPE属性定义记录
例11.1_1
SET SERVEROUTPUT ON 
   DECLARE
     v_student Students%ROWTYPE;
    BEGIN
       SELECT * INTO v_student
         FROM Students WHERE student_id = 10201;
       DBMS_OUTPUT.PUT_LINE ('姓名  性别  专业');
       DBMS_OUTPUT.PUT_LINE
         (v_student.name||'  '||v_student.sex||'  '||v_student.specialty);
    END;

例11.1_2

CREATE VIEW Students_view AS
  SELECT * FROM Students
    WHERE sex='男';

SET SERVEROUTPUT ON 
   DECLARE
     v_student Students_view%ROWTYPE;
    BEGIN
       SELECT * INTO v_student
         FROM Students_view WHERE student_id = 10201;
       DBMS_OUTPUT.PUT_LINE ('姓名  性别  专业');
       DBMS_OUTPUT.PUT_LINE
         (v_student.name||'  '||v_student.sex||'  '||v_student.specialty);
    END;

例11.1_3
SET SERVEROUTPUT ON  
     DECLARE
       CURSOR students_cur
       IS
          SELECT name,dob
            FROM Students
           WHERE specialty = '计算机';
       v_student students_cur%ROWTYPE;
     BEGIN
        DBMS_OUTPUT.PUT_LINE ('序号  学生姓名   出生日期');
        FOR Students_record IN Students_cur LOOP
           v_student.name := Students_record.name;
           v_student.dob := Students_record.dob;
           DBMS_OUTPUT.PUT_LINE (Students_cur%ROWCOUNT||'     '||v_student.name||'     '||v_student.dob);
        END LOOP;
     END;

2.使用显式方法定义记录
例11.1_4
      SET SERVEROUT ON
      DECLARE
      TYPE s_record IS RECORD
          (name Students.name%TYPE,
           sex Students.sex%TYPE,
           dob Students.dob%TYPE);
      students_record s_record;
      v_id Students.student_id%TYPE;
      BEGIN
         v_id := &student_id;
         DBMS_OUTPUT.PUT_LINE ('学生姓名  性别   出生日期');
         SELECT name,sex,dob INTO students_record
           FROM Students WHERE student_id = v_id;
         DBMS_OUTPUT.PUT_LINE (students_record.name||'   '||Students_record.sex||'    '||Students_record.dob);
      EXCEPTION
         WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE (sqlcode||sqlerrm);
      END;

3.使用记录成员
例11.1_5
      SET SERVEROUT ON
      DECLARE
      TYPE s_record IS RECORD
          (name Students.name%TYPE,
           sex Students.sex%TYPE,
           dob Students.dob%TYPE);
      students_record s_record;
      v_specialty Students.specialty%TYPE;
      i INT :=  0;
      BEGIN
         v_specialty := '&specialty';
         DBMS_OUTPUT.PUT_LINE ('序号  学生姓名  性别   出生日期');
         FOR students_row
             IN (SELECT * FROM Students WHERE specialty=v_specialty) LOOP
             i:=i+1;
             students_record.name := students_row.name;
             students_record.sex := students_row.sex;
             students_record.dob := students_row.dob;
             DBMS_OUTPUT.PUT_LINE (i||'     '||students_record.name||'   '||Students_record.sex||'    '||Students_record.dob);
         END LOOP;
      EXCEPTION
         WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE (sqlcode||sqlerrm);
      END;

11.1.3  在DML语句中使用记录
1.在UPDATE语句中
例11.1_6
   DECLARE
      TYPE s_record IS RECORD
          (id Students.student_id%TYPE,
           dob Students.dob%TYPE);
      students_record s_record;  
   BEGIN
      students_record.id := 10101;
      students_record.dob := '25-11月-1990';
      UPDATE Students SET dob = students_record.dob
             WHERE student_id = students_record.id;
   END;

例11.1_7
   DECLARE
      TYPE s_record IS RECORD
          (id Students.student_id%TYPE,
           monitor_id Students.monitor_id%TYPE,
           name Students.name%TYPE,
           sex Students.sex%TYPE,
           dob Students.dob%TYPE,
           specialty Students.specialty%TYPE);
      students_record s_record;  
   BEGIN
      students_record.id := 10288;
      students_record.monitor_id := 10205;
      students_record.name := '王天仪';
      students_record.sex := '男';
      students_record.dob := '25-11月-1990';
      students_record.specialty := '自动化';
      UPDATE Students SET ROW = students_record
             WHERE student_id = 10103;
   END;

2.在INSERT语句中
例11.1_8
   DECLARE
      students_record Students%ROWTYPE;  
   BEGIN
      students_record.student_id := 10288;
      students_record.monitor_id := 10205;
      students_record.name := '王一';
      students_record.sex := '男';
      students_record.dob := '25-11月-1990';
      students_record.specialty := '自动化';
      INSERT INTO Students VALUES students_record;
   END;
例11.1_9
DECLARE
      TYPE s_record IS RECORD
          (id Departments.department_id%TYPE,
           name Departments.department_name%TYPE);
      departments_record s_record;  
   BEGIN
      departments_record.id := 111;
      departments_record.name := '地球物理';
      INSERT INTO Departments(department_id,department_name)
          VALUES (departments_record.id,departments_record.name);
   END;

3.在DELETE语句中
例11.1_10
DECLARE
      TYPE d_record IS RECORD
          (id Departments.department_id%TYPE);
      departments_record d_record;  
   BEGIN
      departments_record.id := 111;
      DELETE FROM Departments WHERE department_id = departments_record.id;
   END;

11.2.2  使用记录表类型
例11.2_1
      SET SERVEROUT ON
      DECLARE
         TYPE student_tab_type IS TABLE OF
           Students%ROWTYPE INDEX BY BINARY_INTEGER;
         student_tab student_tab_type;
         v_id Students.student_id%TYPE;
      BEGIN
         v_id := &student_id;
         SELECT * INTO student_tab(999)
           FROM Students WHERE student_id = v_id;
         DBMS_OUTPUT.PUT_LINE ('学生姓名:'||student_tab(999).name);
         DBMS_OUTPUT.PUT_LINE ('学生性别:'||student_tab(999).sex);
         DBMS_OUTPUT.PUT_LINE ('出生日期:'||student_tab(999).dob);
         DBMS_OUTPUT.PUT_LINE ('专    业:'||student_tab(999).specialty);
      END;

例11.2_2
      SET SERVEROUT ON
      DECLARE
         TYPE student_tab_type IS TABLE OF
           students%ROWTYPE INDEX BY BINARY_INTEGER;
         student_tab student_tab_type;
         v_specialty students.specialty%TYPE;
         CURSOR students_cur
         IS
            SELECT *
              FROM students
              WHERE specialty = v_specialty;
         i INT := 1;
      BEGIN
        v_specialty := '&specialty';
        OPEN students_cur;
        DBMS_OUTPUT.PUT_LINE ('学生姓名   出生日期');
        LOOP
           FETCH Students_cur INTO student_tab(i);
           EXIT WHEN Students_cur%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE
             (student_tab(i).name||'     '||student_tab(i).dob);
           i := i+1;
        END LOOP;
        CLOSE Students_cur;
      END;

例11.2_3
      SET SERVEROUT ON
      DECLARE
         TYPE sname_tab_type IS TABLE OF
           Students.name%TYPE INDEX BY BINARY_INTEGER;
         sname_tab sname_tab_type;
         TYPE sdob_tab_type IS TABLE OF
           Students.dob%TYPE INDEX BY BINARY_INTEGER;
         sdob_tab sdob_tab_type;
         v_specialty Students.specialty%TYPE;
         CURSOR Students_cur
         IS
            SELECT name,dob
              FROM Students
              WHERE specialty = v_specialty;
         i INT:=1;
      BEGIN
        v_specialty := '&specialty';
        OPEN Students_cur;
        DBMS_OUTPUT.PUT_LINE ('学生姓名   出生日期');
        LOOP
           FETCH Students_cur INTO sname_tab(i),sdob_tab(i);
           EXIT WHEN Students_cur%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE (sname_tab(i)||'     '||sdob_tab(i));
           i := i+1;
        END LOOP;
        CLOSE Students_cur;
      END;

11.3.2  使用联合数组
例11.3_1
      SET SERVEROUT ON
      DECLARE
         TYPE sname_tab_type IS TABLE OF
           VARCHAR2(10) INDEX BY BINARY_INTEGER;
         sname_tab sname_tab_type;
         v_id students.student_id%TYPE;
      BEGIN
         v_id := &student_id;
         SELECT name INTO sname_tab(-999)
           FROM students WHERE student_id = v_id;
         DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_tab(-999));
      END;

例11.3_2
      SET SERVEROUT ON
      DECLARE
         TYPE sname_tab_type IS TABLE OF
           students.name%TYPE INDEX BY BINARY_INTEGER;
         sname_tab sname_tab_type;
         TYPE sdob_tab_type IS TABLE OF
           Students.dob%TYPE INDEX BY BINARY_INTEGER;
         sdob_tab sdob_tab_type;
         v_specialty students.specialty%TYPE;
         CURSOR students_cur
         IS
            SELECT name,dob
              FROM students
              WHERE specialty = v_specialty;
         i INT:=1;
      BEGIN
        v_specialty := '&specialty';
        OPEN students_cur;
        DBMS_OUTPUT.PUT_LINE ('学生姓名   出生日期');
        LOOP
           FETCH students_cur INTO sname_tab(i),sdob_tab(i);
           EXIT WHEN students_cur%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE
             (sname_tab(i)||'     '||sdob_tab(i));
           i := i+1;
        END LOOP;
        CLOSE students_cur;
      END;

例11.3_3
      SET SERVEROUT ON
      DECLARE
         TYPE sname_tab_type IS TABLE OF
           Students.name%TYPE INDEX BY VARCHAR2(10);
         sname_tab sname_tab_type;
         v_id Students.student_id%TYPE;
      BEGIN
         v_id := &student_id;
         SELECT name INTO sname_tab('学生姓名')
           FROM Students WHERE student_id = v_id;
         DBMS_OUTPUT.PUT_LINE
           ('学生姓名:'||sname_tab('学生姓名'));
      END;

11.4.2  使用嵌套表类型
1.嵌套表在PL/SQL块中作为数据变量
  (只在PL/SQL块中使用嵌套表)
例11.4_1
   SET SERVEROUT ON
      DECLARE
        TYPE sname_type IS TABLE OF VARCHAR2(10);
        sname_table sname_type :=
          sname_type(NULL,NULL,NULL,'王一');
       BEGIN
         DBMS_OUTPUT.PUT_LINE ('初始化学生姓名:');
         FOR i IN 1..4 LOOP
           DBMS_OUTPUT.PUT_LINE (sname_table(i));       
         END LOOP;
         sname_table(1) := '赵一';
         sname_table(2) := '钱二';
         sname_table(3) := '孙三';
         sname_table(4) := '李四';
         DBMS_OUTPUT.PUT_LINE ('重新指定的学生姓名:');
         FOR i IN 1..4 LOOP
           DBMS_OUTPUT.PUT_LINE (sname_table(i));       
         END LOOP;
     END;

例11.4_2
      SET SERVEROUT ON
      DECLARE
        TYPE sname_type IS TABLE OF
          students.name%TYPE NOT NULL;
        sname_table sname_type := sname_type('张三','张三');
        v_id Students.student_id%TYPE;
      BEGIN
        v_id := &student_id;
        SELECT name
          INTO sname_table(1)
          FROM Students
          WHERE student_id = v_id;
        DBMS_OUTPUT.PUT_LINE ('学生1姓名:'||sname_table(1));
        DBMS_OUTPUT.PUT_LINE ('学生2姓名:'||sname_table(2));     
      END;

2.嵌套表作为表列的数据类型

CREATE TYPE sname_type IS TABLE OF VARCHAR2(10);

CREATE TABLE Mentors (
  mentor_id NUMBER(5)
    CONSTRAINT mentor_pk PRIMARY KEY,
  mentor_name VARCHAR2(10) NOT NULL,
  student_name sname_type
)NESTED TABLE student_name STORE AS sname_table;

例11.4_3
BEGIN
  INSERT INTO mentors
    VALUES(10101,'王彤',sname_type('王晓芳','张纯玉','刘春苹'));
END;

例11.4_4
SET SERVEROUT ON
  DECLARE
    sname_table sname_type;
  BEGIN
    SELECT student_name INTO sname_table
      FROM Mentors WHERE mentor_name = '王彤';
    DBMS_OUTPUT.PUT_LINE ('王彤导师的研究生姓名:');
    FOR i IN 1..sname_table.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE (sname_table(i));
    END LOOP;
  END;

例11.4_5 修改表mentors中student_name列的数据。
      DECLARE
        sname_table sname_type :=
          sname_type('王一','张三','刘四');
      BEGIN
        UPDATE Mentors
        SET student_name = sname_table
        WHERE mentor_name = '王彤';
      END;

sname_varry_type、变长数组类型变量sname_varry
11.5.2  使用变长数组类型
1.变长数组在PL/SQL块中作为数据变量
例11.5_1
    SET SERVEROUT ON
      DECLARE
        TYPE sname_varry_type IS VARRAY(3) OF VARCHAR2(10);
        sname_varry sname_varry_type :=
          sname_varry_type(NULL,NULL,'李四');
       BEGIN
         DBMS_OUTPUT.PUT_LINE ('初始化学生姓名:');
         FOR i IN 1..3 LOOP
           DBMS_OUTPUT.PUT_LINE (sname_varry(i));       
         END LOOP;
         sname_varry(1) := '赵一';
         sname_varry(2) := '钱二';
         sname_varry(3) := '孙三';
         DBMS_OUTPUT.PUT_LINE ('重新指定的学生姓名:');
         FOR i IN 1..3 LOOP
           DBMS_OUTPUT.PUT_LINE (sname_varry(i));       
         END LOOP;
      END;

例11.5_2
      SET SERVEROUT ON
      DECLARE
        TYPE sname_type IS VARRAY(3) OF VARCHAR2(10);
        sname_varry sname_type;
        v_id Students.student_id%TYPE;
      BEGIN
        v_id := &student_id;
        sname_varry := sname_type('李四','李四');
        SELECT name
        INTO sname_varry(2)
        FROM Students
        WHERE student_id = v_id;
        DBMS_OUTPUT.PUT_LINE ('学生1姓名:'||sname_varry(1));
        DBMS_OUTPUT.PUT_LINE ('学生2姓名:'||sname_varry(2));        
      END;

2.变长数组作为表列的数据类型

CREATE TYPE studname_type IS VARRAY(15) OF VARCHAR2(10);

CREATE TABLE hierophants(
  hierophant_id NUMBER(5)
    CONSTRAINT hierophant_pk PRIMARY KEY,
  hierophant_name VARCHAR2(10) NOT NULL,
  student_name studname_type
);

例11.5_3
BEGIN
  INSERT INTO hierophants
    VALUES(10101,'王彤',studname_type('王晓芳','张纯玉','刘春苹'));
END;

例11.5_4
    SET SERVEROUT ON
      DECLARE
        studname_varry studname_type;
      BEGIN
        SELECT student_name INTO studname_varry
          FROM hierophants
            WHERE hierophant_name = '王彤';
        DBMS_OUTPUT.PUT_LINE ('王彤导师的研究生姓名:');
        FOR i IN 1..studname_varry.COUNT LOOP
           DBMS_OUTPUT.PUT_LINE (studname_varry(i));
        END LOOP;
      END;

例11.5_5
      DECLARE
        studname_varry studname_type :=
          studname_type('王一','张三','刘四');
      BEGIN
        UPDATE hierophants
        SET student_name = studname_varry
        WHERE hierophant_name = '王彤';
      END;

11.6  集合操作
11.6.1  集合属性与方法
1.集合属性
(1)COUNT属性
例11.6_1
     SET SERVEROUTPUT ON  
     DECLARE
       TYPE sname_tab_type IS TABLE OF
         students.name%TYPE INDEX BY BINARY_INTEGER;
       sname_tab sname_tab_type;
       i INT:=1;
     BEGIN
       FOR students_record IN
         (SELECT name FROM students WHERE specialty = '计算机') LOOP
           sname_tab(i) := students_record.name;
           i := i+1;
        END LOOP;
        DBMS_OUTPUT.PUT_LINE
          ('计算机专业共有学生总数:'||sname_tab.COUNT||' 名。');
     END;

(2)LIMIT属性
例11.6_2
  SET SERVEROUT ON
    DECLARE
      TYPE sname_varry_type IS VARRAY(15) OF students.name%TYPE;
      sname_varry sname_varry_type :=
        sname_varry_type('王一','李二','张三');
    BEGIN
      DBMS_OUTPUT.PUT_LINE
        ('集合(VARRAY)变量的最大下标值:'||sname_varry.LIMIT);
      DBMS_OUTPUT.PUT_LINE
        ('集合(VARRAY)变量的元素个数:'||sname_varry.COUNT);
    END;

(3)EXIST()属性
例11.6_3
  SET SERVEROUT ON
    DECLARE
      TYPE sname_tab_type IS TABLE OF VARCHAR2(10);
      sname_tab sname_tab_type;
      v_id students.student_id%TYPE;
    BEGIN
      v_id := &student_id;
      IF sname_tab.EXISTS(1) THEN
         NULL;
      ELSE
         sname_tab := sname_tab_type('王一','李二','张三');
      END IF;  
      SELECT name INTO sname_tab(1)
        FROM students
          WHERE student_id = v_id;
      DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_tab(1));
    END;

(4)FIRST与 LAST属性
例11.6_4
  SET SERVEROUTPUT ON  
    DECLARE
      TYPE sname_tab_type IS TABLE OF
        students.name%TYPE INDEX BY BINARY_INTEGER;
      sname_tab sname_tab_type;
      i INT := -10;
    BEGIN
      FOR students_record IN
        (SELECT name FROM students WHERE specialty = '计算机') LOOP
          sname_tab(i) := students_record.name;
          i := i+10;
      END LOOP;
      DBMS_OUTPUT.PUT_LINE ('第一个元素下标为:'||sname_tab.FIRST);
      DBMS_OUTPUT.PUT_LINE ('sname_tab中元素个数:'||sname_tab.COUNT);
      DBMS_OUTPUT.PUT_LINE ('最后一个元素下标为:'||sname_tab.LAST);
    END;
(5)NEXT() PRIOR()
例11.6_5
  SET SERVEROUTPUT ON  
    DECLARE
      TYPE sname_tab_type IS TABLE OF
        students.name%TYPE INDEX BY BINARY_INTEGER;
        sname_tab sname_tab_type;
        i INT := -10;
        counter INT;
    BEGIN
      FOR students_record IN
         (SELECT name FROM students WHERE specialty = '计算机') LOOP
           sname_tab(i) := students_record.name;
           i := i+10;
      END LOOP;
      counter := sname_tab.FIRST;
      WHILE counter <= sname_tab.LAST LOOP
        DBMS_OUTPUT.PUT_LINE
          ('sname_tab('||counter||') = '||sname_tab(counter));
        counter := sname_tab.NEXT(counter);
      END LOOP;
    END;
2.集合方法
(1)DELETE方法
例11.6_6
  SET SERVEROUTPUT ON  
    DECLARE
      TYPE sname_type IS TABLE OF VARCHAR2(10);
      sname_varry sname_type :=
        sname_type('王一','李二','张三','赵四','周五','刘六');
    BEGIN
      DBMS_OUTPUT.PUT_LINE
        ('sname_varry初始元素个数:'||sname_varry.COUNT);
      sname_varry.DELETE(2);
      DBMS_OUTPUT.PUT_LINE
        ('DELETE(2)后sname_varry元素个数:'||sname_varry.COUNT);
      sname_varry.DELETE(3,5);
      DBMS_OUTPUT.PUT_LINE
        ('DELETE(3,5)后sname_varry元素个数:'||sname_varry.COUNT);  
      sname_varry.DELETE;
      DBMS_OUTPUT.PUT_LINE
        ('DELETE后sname_tab元素个数:'||sname_varry.COUNT);
    END;

(2)EXTEND方法
例11.6_7
  SET SERVEROUTPUT ON  
    DECLARE
      TYPE sname_type IS TABLE OF VARCHAR2(10);
      sname_varry sname_type :=
        sname_type('王一','李二','张三');
      i INT:=1;
    BEGIN
      DBMS_OUTPUT.PUT_LINE
        ('sname_varry初始元素个数:'||sname_varry.COUNT);
      sname_varry.EXTEND;
      DBMS_OUTPUT.PUT_LINE
        ('EXTEND后sname_varry元素:'||sname_varry.COUNT);
      sname_varry.EXTEND(2,3);
      DBMS_OUTPUT.PUT_LINE
        ('EXTEND(2,3)后sname_varry元素个数:'||sname_varry.COUNT);
      sname_varry.EXTEND(2);
      DBMS_OUTPUT.PUT_LINE
        ('EXTEND(2)后sname_varry元素个数:'||sname_varry.COUNT);
      WHILE i <= sname_varry.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_varry(i));
        i := i+1;
      END LOOP;           
    END;

(3)TRIM方法
例11.6_8
  SET SERVEROUTPUT ON  
    DECLARE
      TYPE sname_type IS TABLE OF VARCHAR2(10);
      sname_varry sname_type :=
        sname_type('王一','李二','张三','赵四','周五','刘六');
      i INT:=1;
    BEGIN
      DBMS_OUTPUT.PUT_LINE
        ('sname_varry初始元素个数:'||sname_varry.COUNT);
      sname_varry.TRIM;
      DBMS_OUTPUT.PUT_LINE
        ('TRIM后sname_varry元素个数:'||sname_varry.COUNT);
      sname_varry.TRIM(2);
      DBMS_OUTPUT.PUT_LINE
        ('TRIM(2)后sname_varry元素个数:'||sname_varry.COUNT);
      WHILE i <= sname_varry.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_varry(i));
        i := i+1;
      END LOOP;           
    END;

11.6.2  使用集合操作符
DELETE FROM mentors;
INSERT INTO mentors
  VALUES(10101,'王彤',sname_type('王晓芳','张纯玉','刘春苹','王晓芳'));
INSERT INTO mentors
  VALUES(10104,'孔世杰',sname_type('王天仪','韩刘','刘春苹'));
     
例11.6_9
      SET SERVEROUT ON
      DECLARE
        sname_table1 sname_type;
        sname_table sname_type;
      BEGIN
         SELECT student_name
           INTO sname_table1
           FROM mentors
           WHERE mentor_name = '王彤';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table1中的元素--');        
         FOR i IN 1..sname_table1.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table1(i));
         END LOOP;
         sname_table := SET(sname_table1);
         DBMS_OUTPUT.PUT_LINE ('集合sname_table中的元素--');  
         FOR i IN 1..sname_table.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table(i));
         END LOOP;
      END;

例11.6_10
     SET SERVEROUT ON
      DECLARE
        sname_table1 sname_type;
        sname_table2 sname_type;
        sname_table sname_type;
      BEGIN
         SELECT student_name
           INTO sname_table1
           FROM mentors
           WHERE mentor_name = '王彤';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table1中的元素--');        
         FOR i IN 1..sname_table1.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table1(i));
         END LOOP;
         SELECT student_name
           INTO sname_table2
           FROM Mentors
           WHERE mentor_name = '孔世杰';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table2中的元素--');        
         FOR i IN 1..sname_table2.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table2(i));
         END LOOP;
         sname_table := sname_table1 MULTISET UNION sname_table2;
         DBMS_OUTPUT.PUT_LINE ('集合sname_table中的元素--');  
         FOR i IN 1..sname_table.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table(i));
         END LOOP;
      END;

例11.6_11
     SET SERVEROUT ON
      DECLARE
        sname_table1 sname_type;
        sname_table2 sname_type;
        sname_table sname_type;
      BEGIN
         SELECT student_name
           INTO sname_table1
           FROM mentors
           WHERE mentor_name = '王彤';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table1中的元素--');        
         FOR i IN 1..sname_table1.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table1(i));
         END LOOP;
         SELECT student_name
           INTO sname_table2
           FROM mentors
           WHERE mentor_name = '孔世杰';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table2中的元素--');        
         FOR i IN 1..sname_table2.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table2(i));
         END LOOP;
         sname_table := sname_table1 MULTISET UNION DISTINCT sname_table2;
         DBMS_OUTPUT.PUT_LINE ('集合sname_table中的元素--');  
         FOR i IN 1..sname_table.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table(i));
         END LOOP;
      END;

例11.6_12
     SET SERVEROUT ON
      DECLARE
        sname_table1 sname_type;
        sname_table2 sname_type;
        sname_table sname_type;
      BEGIN
         SELECT student_name
           INTO sname_table1
           FROM Mentors
           WHERE mentor_name = '王彤';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table1中的元素--');        
         FOR i IN 1..sname_table1.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table1(i));
         END LOOP;
         SELECT student_name
           INTO sname_table2
           FROM Mentors
           WHERE mentor_name = '孔世杰';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table2中的元素--');        
         FOR i IN 1..sname_table2.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table2(i));
         END LOOP;
         sname_table := sname_table1 MULTISET INTERSECT sname_table2;
         DBMS_OUTPUT.PUT_LINE ('集合sname_table中的元素--');  
         FOR i IN 1..sname_table.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table(i));
         END LOOP;
      END;

例11.6_13
     SET SERVEROUT ON
      DECLARE
        sname_table1 sname_type;
        sname_table2 sname_type;
        sname_table sname_type;
      BEGIN
         SELECT student_name
           INTO sname_table1
           FROM mentors
           WHERE mentor_name = '王彤';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table1中的元素--');        
         FOR i IN 1..sname_table1.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table1(i));
         END LOOP;
         SELECT student_name
           INTO sname_table2
           FROM mentors
           WHERE mentor_name = '孔世杰';
         DBMS_OUTPUT.PUT_LINE ('集合sname_table2中的元素--');        
         FOR i IN 1..sname_table2.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table2(i));
         END LOOP;
         sname_table := sname_table1 MULTISET EXCEPT sname_table2;
         DBMS_OUTPUT.PUT_LINE ('集合sname_table中的元素--');  
         FOR i IN 1..sname_table.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE ('学生姓名:'||sname_table(i));
         END LOOP;
      END;

SQL语句 第11章 复合数据类型相关推荐

  1. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  2. Go语言圣经 - 第4章 复合数据类型 - 4.5 JSON

    第四章 复合数据类型 基础数据类型是Go语言世界的原子 复合数据类型包括四种:slice.map. struct.array 数组和结构体是聚合类型,它们的值由许多元素或成员构成,数组和结构体都是固定 ...

  3. mysql5.7.17 32_mysql—MySQL 5.7.17安装及基本SQL语句(第七章)

    DBS ------- DataBase System 数据库系统 以关系(二维表)的方式的存储数据 记录 Record 字段/属性Column 数据库, 库 约束 Constraint 域约束:数据 ...

  4. MySQL高级SQL语句(终章)

    目录 一:通配符 1.1查询名字是有开头的记录 1.2查询名字里是贝和摩中间有一个字符的记录 1.3查看贝后面3个字符的名字记录 1.4通配符%和_结合使用 二:子查询 2.1相同表查询 2.2不同表 ...

  5. Mysql常用sql语句(11)- between and 范围查询

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 between and可以判断值是否在指定范围内 ...

  6. java逐行读取文件内容执行sql语句_[11/100] 文件和异常

    最近学习效率很低,居然还开始熬夜玩耍了.好好干啊,技术差就要多付出啊. 操作模式 选择操作模式 读写文本文件 1.读取 import timedef main():f = Nonetry:# 一次性读 ...

  7. 常用SQL语句实例 11

    为什么80%的码农都做不了架构师?>>>    Insert into test (`id`,`uid`,`regdate`,`remark`) values ('','啊明',no ...

  8. 金仓数据库 KingbaseES SQL 语言参考手册 (11. SQL语句:ABORT 到 ALTER INDEX)

    11. SQL语句:ABORT 到 ALTER INDEX 本章描述各种类型的SQL语句,由于类型较多,将按字母顺序排列分组.这是第一组SQL语句. 包含以下章节: SQL语句类型 SQL语句各章节是 ...

  9. Python程序设计 第4章:复合数据类型

    Python 是全球范围内最受欢迎的编程语言,学好Python将对个人职业生涯产生很大的助力,因此推出Python程序设计系列文章: Python程序设计 第1章:初识Python Python程序设 ...

最新文章

  1. OpenCV | ORB特征检测与描述
  2. android自定义尺子收集demo
  3. 启明云端分享| ESP32-C3智能写字板应用解决方案
  4. 带哨兵节点的链_Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件)...
  5. Clob 2 String
  6. java反射接口_Java反射详解
  7. VScode中文注释乱码问题解决
  8. android 多媒体音频占用情况监听
  9. Flash游戏开发框架Flixel介绍
  10. 安全测试简历项目经验怎么写?
  11. 如何找到外文文献对应的中文文献?
  12. Nacos 2.0原理解析(一):Distro协议
  13. vue实现websoket即时通讯
  14. u盘制作启动盘后空间容量变小解决方法
  15. ROM(只读存储器)
  16. Python图像识别及操作
  17. 【花雕动手做】有趣好玩的音乐可视化系列小项目(18)--LED平面板灯
  18. oracle中bonus用法,Oracle中scott用户的emp、dept、bonus、salgrade建表代码与数据
  19. 《被讨厌的勇气》- 认真的人生活在当下
  20. Python 去掉空格的方法

热门文章

  1. 统计学习 最小错误率与最小风险的贝叶斯决策
  2. c语言写一元一次函数图像,【仿真】绘制一次函数图像
  3. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十三) 锦上添花之魔法特效装饰
  4. 吉比特面试总结(一)
  5. MATLAB中白噪声的WGN和AWGN函数的使用以及信噪比的计算
  6. 全球大学生超级计算机竞赛排名,这所中国高校全球大学生超级计算机竞赛夺冠 怒赞...
  7. 跨越数字资产新维度——BOX首届数字通证资产安全技术研讨会在沪顺利召开
  8. 6.7绝地求生服务器维护,绝地求生6月5日更新维护全内容及官方更新时间
  9. 【数智化案例展】绿盾征信——网智天元助力边境经济合作区产融合作服务平台建设...
  10. 从dvbsnoop到ts demux的设计