PLSQL--集合

来源:互联网 发布:百香坊沉香淘宝 编辑:程序博客网 时间:2024/05/22 12:37

1.联合数组:

DECLARE
    CURSOR name_cur IS
        SELECT last_name FROM student WHERE rownum <= 10;
    TYPE last_name_type IS TABLE OF student.last_name%TYPE INDEX BY BINARY_INTEGER;
    last_name_tab last_name_type;
    v_counter     INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        last_name_tab(v_counter) := name_rec.last_name;
        dbms_output.put_line('last_name(' || v_counter || '): ' ||
                             last_name_tab(v_counter));
    END LOOP;
END;

引用不存在的数据行会抛出错误:

DECLARE
    CURSOR name_cur IS
        SELECT last_name FROM student WHERE rownum <= 10;
    TYPE last_name_type IS TABLE OF student.last_name%TYPE INDEX BY BINARY_INTEGER;
    last_name_tab last_name_type;
    v_counter     INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        last_name_tab(v_counter) := name_rec.last_name;
        dbms_output.put_line('last_name(' || v_counter || '): ' ||
                             last_name_tab(v_counter));
    END LOOP;
    dbms_output.put_line('last_name(11)||: ' || last_name_tab(11));
EXCEPTION
    WHEN no_data_found THEN
        dbms_output.put_line('NO_DATA');
 19  END;
 20  /
last_name(1): Crocitto
last_name(2): Landry
last_name(3): Enison
last_name(4): Moskowitz
last_name(5): Olvsade
last_name(6): Mierzwa
last_name(7): Sethi
last_name(8): Walter
last_name(9): Martin
last_name(10): Noviello
NO_DATA

PL/SQL procedure successfully completed.

嵌套表:

DECLARE
    CURSOR course_cur IS
        SELECT description FROM course;
    TYPE course_type IS TABLE OF course.description%TYPE;
    course_tab course_type := course_type(); --要初始化
    v_counter  INTEGER := 0;
BEGIN
    FOR course_rec IN course_cur
    LOOP
        v_counter := v_counter + 1;
        course_tab.extend;
        course_tab(v_counter) := course_rec.description;
    END LOOP;
END;

DECLARE
    CURSOR course_cur IS
        SELECT description FROM course;
    TYPE course_type IS TABLE OF course.description%TYPE;
    course_tab course_type := course_type(); --要初始化
    v_counter  INTEGER := 0;
BEGIN
    FOR course_rec IN course_cur
    LOOP
        v_counter := v_counter + 1;
        course_tab.extend;
        course_tab(v_counter) := course_rec.description;
    END LOOP;
    /* course_tab.delete(30);*/ --使用DELETE方法删除最后一个元素,delete后会保持被删除元素的占位符,因此不会抛出错误。
    course_tab.trim; --PL/SQL不会保持被裁剪元素的占位符,结果,引用被裁剪的元素会导致subscript beyond count错误
    course_tab(30) := 'New Course';
END;

DECLARE
    CURSOR course_cur IS
        SELECT description FROM course;
    TYPE course_type IS TABLE OF course.description%TYPE;
    course_tab course_type := course_type(); --要初始化
    v_counter  INTEGER := 0;
BEGIN
    FOR course_rec IN course_cur
    LOOP
        v_counter := v_counter + 1;
        course_tab.extend;
        course_tab(v_counter) := course_rec.description;
    END LOOP;
    /* course_tab.delete(30);*/ 
    course_tab.trim; 
    course_tab.extend; --增加集合尺寸大小,不会抛出错误
    course_tab(30) := 'New Course';
END;

变长数组:

DECLARE
    CURSOR name_cur IS
        SELECT last_name FROM student WHERE rownum <= 10;
    TYPE last_name_type IS VARRAY(10) OF student.last_name%TYPE;
    last_name_varray last_name_type := last_name_type();
    v_counter        INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        last_name_varray.extend;
        last_name_varray(v_counter) := name_rec.last_name;
        dbms_output.put_line('last_name(' || v_counter || '): ' ||
                             last_name_varray(v_counter));
    END LOOP;
END;

DECLARE
    TYPE varray_type IS VARRAY(10) OF NUMBER;
    VARRAY varray_type := varray_type(1, 2, 3, 4, 5, 6);
BEGIN
    dbms_output.put_line('varray.count=' || varray.count);
    dbms_output.put_line('varray.limit=' || varray.limit);
    dbms_output.put_line('varray.fist=' || varray.first);
    dbms_output.put_line('varray.last=' || varray.last);
END;


DECLARE
    CURSOR city_cur IS
        SELECT city FROM zipcode WHERE rownum <= 10;
    TYPE city_type IS VARRAY(10) OF zipcode.city%TYPE;
    city_varray city_type := city_type(); --初始化
    v_counter   INTEGER := 0;
BEGIN
    FOR city_rec IN city_cur
    LOOP
        v_counter := v_counter + 1;
        city_varray.extend;--引用单个元素之前,用extend
        city_varray(v_counter) := city_rec.city;
        dbms_output.put_line('city_varray(' || v_counter || '): ' ||
                             city_varray(v_counter));
    END LOOP;
END;

    TYPE city_type IS VARRAY(20) OF zipcode.city%TYPE;
    city_varray city_type := city_type();
    v_counter   INTEGER := 0;
BEGIN
    FOR city_rec IN city_cur
    LOOP
        v_counter := v_counter + 1;
        city_varray.extend;
        city_varray(v_counter) := city_rec.city;
    END LOOP;
    FOR i IN 1 .. v_counter
    LOOP
        --extend the size of varray by 1 and copy the current element to the last elemant
        city_varray.extend(1, i);
    END LOOP;
    FOR i IN 1 .. 20
    LOOP
        dbms_output.put_line('city_varray(' || i || '): ' ||
                             city_varray(i));
    END LOOP;
END;

多层集合:

DECLARE
    TYPE table_type1 IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
    TYPE table_type2 IS TABLE OF table_type1 INDEX BY BINARY_INTEGER;
    table_tab1 table_type1;
    table_tab2 table_type2;
BEGIN
    FOR i IN 1 .. 2
    LOOP
        FOR j IN 1 .. 3
        LOOP
            IF i = 1
            THEN
                table_tab1(j) := j;
            ELSE
                table_tab1(j) := 4 - j;
            END IF;
            table_tab2(i)(j) := table_tab1(j);
            dbms_output.put_line('table_tabq2(' || i || ')(' || j || '): ' ||
                                 table_tab2(i) (j));
        END LOOP;
    END LOOP;
END;


练习:

1.创建如下脚本:创建一个联合数组,使用教师的全名来填充它。也就是说,联合数组的每行数据都应该包含教师的第一个名字,中间名和姓氏。

DECLARE
    CURSOR name_cur IS
        SELECT first_name || ' ' || last_name NAME FROM instructor;
    TYPE name_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
    name_tab  name_type;
    v_counter NUMBER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        name_tab(v_counter) := name_rec.name;
        dbms_output.put_line('name(' || v_counter || '): ' ||
                             name_tab(v_counter));
    END LOOP;
END;

2.修改以上脚本,改成变长数组:

DECLARE
    CURSOR name_cur IS
        SELECT first_name || ' ' || last_name NAME FROM instructor;
    TYPE name_type IS VARRAY(15) OF VARCHAR2(50);
    name_varray name_type := name_type();
    v_counter   INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        name_varray.extend;
        name_varray(v_counter) := name_rec.name;
        dbms_output.put_line('name(' || v_counter || '): ' ||
                             name_varray(v_counter));
    END LOOP;
END;

在脚本的这个版本中,定义了一个包含15个元素的数组。要特别注意,在引用数组的元素之前,要初始化这个数组,除此之外,往该数组添加新的元素之前,必须扩展这个数组。

3.修改以上脚本,创建另一个变长数组,使用每个教师所教授的课程的课程编号来填充。请在屏幕上显示教师的名字,已经所教授课程的列表;

DECLARE
    CURSOR instructor_cur IS
        SELECT instructor_id, first_name || ' ' || last_name NAME
          FROM instructor;
    CURSOR course_cur(p_instructor_id NUMBER) IS
        SELECT UNIQUE course_no course
          FROM section
         WHERE instructor_id = p_instructor_id;
    TYPE name_type IS VARRAY(15) OF VARCHAR2(50);
    name_varray name_type := name_type();
    TYPE course_type IS VARRAY(11) OF NUMBER;
    course_varray course_type;
    v_counter1    INTEGER := 0;
    v_counter2    INTEGER;
BEGIN
    FOR instructor_rec IN instructor_cur
    LOOP
        v_counter1 := v_counter1 + 1;
        name_varray.extend;
        name_varray(v_counter1) := instructor_rec.name;
        dbms_output.put_line('name(' || v_counter1 || '): ' ||
                             name_varray(v_counter1));
        --Initialize and populate course_varray
        v_counter2    := 0;
        course_varray := course_type();
        FOR course_rec IN course_cur(instructor_rec.instructor_id)
        LOOP
            v_counter2 := v_counter2 + 1;
            course_varray.extend;
            course_varray(v_counter2) := course_rec.course;
            dbms_output.put_line('course(' || v_counter2 || '): ' ||
                                 course_varray(v_counter2));
        END LOOP;
        dbms_output.put_line('=========================================');
    END LOOP;
END;


DECLARE
    TYPE varray_type1 IS VARRAY(7) OF INTEGER;
    TYPE table_type2 IS TABLE OF varray_type1 INDEX BY BINARY_INTEGER;
    varray1 varray_type1 := varray_type1(1, 2, 3);
    table2  table_type2;
    --table2 table_type2:=table_type2(varray2,varray_type1(8,9,10));
BEGIN
    --There statements populate associate array
    table2(1) := varray1;
    table2(2) := varray_type1(8, 9, 10);
    dbms_output.put_line('table2(1)(2): ' || table2(1) (2));
    FOR i IN 4 .. 7
    LOOP
        varray1.extend;
        varray1(i) := i;
    END LOOP;
    --display element of the varray
    FOR i IN 1 .. 7
    LOOP
        dbms_output.put_line('varray1(' || i || '): ' || varray1(i));
    END LOOP;
END;

0 0
原创粉丝点击