PLSQL--記錄

1.基於表和基於遊標的記錄:

基於表的記錄:

DECLARE
    course_rec course%ROWTYPE;
BEGIN
    SELECT * INTO course_rec FROM course WHERE course_no = 25;
    dbms_output.put_line('Course No: ' || course_rec.course_no);
    dbms_output.put_line('Course Description: ' || course_rec.description);
    dbms_output.put_line('Course Prereqquisite: ' ||
                         course_rec.prerequisite);
END;


基於遊標的記錄:

DECLARE
    CURSOR student_cur IS
        SELECT first_name, last_name, registration_date
          FROM student
         WHERE rownum <= 4;
    student_rec student_cur%ROWTYPE;--基於遊標的再聲明,注意在遊標後面
BEGIN
    OPEN student_cur;
    LOOP
        FETCH student_cur
            INTO student_rec;
        EXIT WHEN student_cur%NOTFOUND;
        dbms_output.put_line('Name: ' || student_rec.first_name || ' ' ||
                             student_rec.last_name);
        dbms_output.put_line('Registration Date :' ||
                             student_rec.registration_date);
    END LOOP;
END;


基於用戶定義的記錄:

DECLARE
    CURSOR course_cur IS
        SELECT * FROM course WHERE rownum <= 4;
    TYPE course_type IS RECORD(
        course_no     NUMBER(38),
        description   VARCHAR2(50),
        cost          NUMBER(9, 2),
        prerequisite  NUMBER(8),
        created_by    VARCHAR2(30),
        created_date  DATE,
        modified_by   VARCHAR2(30),
        modified_date DATE);
    course_rec1 course%ROWTYPE; --table_based record
    course_rec2 course_cur%ROWTYPE; --cursor-based record
    course_rec3 course_type; --user-define record
BEGIN
    SELECT * INTO course_rec1 FROM course WHERE course_no = 10;
    OPEN course_cur;
    LOOP
        FETCH course_cur
            INTO course_rec2;
        EXIT WHEN course_cur%NOTFOUND;
    END LOOP;
    course_rec1 := course_rec2;
    course_rec3 := course_rec2;
END;

嵌套記錄:

DECLARE
    TYPE name_type IS RECORD(
        first_name VARCHAR2(15),
        last_name  VARCHAR2(30));
    TYPE person_type IS RECORD(
        NAME   name_type,
        street VARCHAR2(50),
        city   VARCHAR2(25),
        state  VARCHAR2(2),
        zip    VARCHAR2(5));
    person_rec person_type;
BEGIN
    SELECT first_name, last_name, street_address, city, state, zip
      INTO person_rec.name.first_name,
           person_rec.name.last_name,
           person_rec.street,
           person_rec.city,
           person_rec.state,
           person_rec.zip
      FROM student
      JOIN zipcode
     USING (zip)
     WHERE rownum < 2;
    dbms_output.put_line('Name: ' || person_rec.name.first_name || ' ' ||
                         person_rec.name.last_name);
    dbms_output.put_line('Street: ' || person_rec.street);
    dbms_output.put_line('City: ' || person_rec.city);
    dbms_output.put_line('State: ' || person_rec.state);
    dbms_output.put_line('Zip: ' || person_rec.zip);
END;


DDECLARE
    TYPE last_name_type IS TABLE OF student.last_name%TYPE INDEX BY BINARY_INTEGER;
    TYPE zip_info_type IS RECORD(
        zip           VARCHAR2(5),
        last_name_tab last_name_type);
    CURSOR name_cur(p_zip VARCHAR2) IS
        SELECT last_name FROM student WHERE zip = p_zip;
    zip_info_rec zip_info_type;
    v_zip        VARCHAR2(5) := '&svz_zip';
    v_counter    INTEGER := 0;
BEGIN
    zip_info_rec.zip := v_zip;
    dbms_output.put_line('Zip: ' || zip_info_rec.zip);
    FOR name_rec IN name_cur(v_zip)
    LOOP
        v_counter := v_counter + 1;
        zip_info_rec.last_name_tab(v_counter) := name_rec.last_name;
        dbms_output.put_line('Names(' || v_counter || '):' ||
                             zip_info_rec.last_name_tab(v_counter));
    END LOOP;
END;

用FOR循環得到所有學生的郵政編碼:

DECLARE
    TYPE last_name_type IS TABLE OF student.last_name%TYPE INDEX BY BINARY_INTEGER;
    TYPE zip_info_type IS RECORD(
        zip           VARCHAR2(5),
        last_name_tab last_name_type);
    CURSOR zip_cur IS
        SELECT zip, COUNT(*) FROM student GROUP BY zip HAVING COUNT(*) > 1;
    CURSOR name_cur(p_zip VARCHAR2) IS
        SELECT last_name FROM student WHERE zip = p_zip;
    zip_info_rec zip_info_type;
    v_counter    INTEGER;
BEGIN
    FOR zip_rec IN zip_cur
    LOOP
        zip_info_rec.zip := zip_rec.zip;
        dbms_output.put_line('Zip: ' || zip_info_rec.zip);
        v_counter := 0;
        FOR name_rec IN name_cur(zip_info_rec.zip)
        LOOP
            v_counter := v_counter + 1;
            zip_info_rec.last_name_tab(v_counter) := name_rec.last_name;
            dbms_output.put_line('Names(' || v_counter || '):' ||
                                 zip_info_rec.last_name_tab(v_counter));
        END LOOP;
        dbms_output.put_line('------------------------------');
    END LOOP;
END;

記錄的集合:

DECLARE
    CURSOR name_cur IS
        SELECT first_name, last_name FROM student WHERE rownum <= 4;
    TYPE name_type IS TABLE OF name_cur%ROWTYPE INDEX BY BINARY_INTEGER;
    name_tab  name_type;
    v_counter INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        name_tab(v_counter).first_name := name_rec.first_name;
        name_tab(v_counter).last_name := name_rec.last_name;
        dbms_output.put_line('First Name(' || v_counter || '): ' || name_tab(v_counter)
                             .first_name);
        dbms_output.put_line('Last Name(' || v_counter || '): ' || name_tab(v_counter)
                             .last_name);
    END LOOP;
END;

修改上述腳本,不在使用聯合數組,而使用嵌套表:

DECLARE
    CURSOR name_cur IS
        SELECT first_name, last_name FROM student WHERE rownum <= 4;
    TYPE name_type IS TABLE OF name_cur%ROWTYPE;
    name_tab  name_type:=name_type();
    v_counter INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
name_tab.extend;
        name_tab(v_counter).first_name := name_rec.first_name;
        name_tab(v_counter).last_name := name_rec.last_name;
        dbms_output.put_line('First Name(' || v_counter || '): ' || name_tab(v_counter)
                             .first_name);
        dbms_output.put_line('Last Name(' || v_counter || '): ' || name_tab(v_counter)
                             .last_name);
    END LOOP;
END;

修改以上腳本,使用變長數組:

DECLARE
    CURSOR name_cur IS
        SELECT first_name, last_name FROM student WHERE rownum <= 4;
    TYPE name_type IS VARRAY(4) OF name_cur%ROWTYPE;
    name_tab  name_type := name_type();
    v_counter INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        name_tab.extend;
        name_tab(v_counter).first_name := name_rec.first_name;
        name_tab(v_counter).last_name := name_rec.last_name;
        dbms_output.put_line('First Name(' || v_counter || '): ' || name_tab(v_counter)
                             .first_name);
        dbms_output.put_line('Last Name(' || v_counter || '): ' || name_tab(v_counter)
                             .last_name);
    END LOOP;
END;

修改以上腳本,不在使用基於遊標的記錄,而是使用用戶定義的記錄:

DECLARE
    CURSOR name_cur IS
        SELECT first_name, last_name, COUNT(*) total
          FROM student
          JOIN enrollment
         USING (student_id)
         GROUP BY first_name, last_name;
    TYPE student_rec_type IS RECORD(
        first_name  VARCHAR2(15),
        last_name   VARCHAR2(30),
        enrollments INTEGER);
    TYPE name_type IS TABLE OF student_rec_type INDEX BY BINARY_INTEGER;
    name_tab  name_type;
    v_counter INTEGER := 0;
BEGIN
    FOR name_rec IN name_cur
    LOOP
        v_counter := v_counter + 1;
        name_tab(v_counter).first_name := name_rec.first_name;
        name_tab(v_counter).last_name := name_rec.last_name;
        name_tab(v_counter).enrollments := name_rec.total;
        IF v_counter <= 4
        THEN
            dbms_output.put_line('First Name(' || v_counter || '): ' || name_tab(v_counter)
                                 .first_name);
            dbms_output.put_line('Last Name(' || v_counter || '): ' || name_tab(v_counter)
                                 .last_name);
            dbms_output.put_line('Enrollments(' || v_counter || '): ' || name_tab(v_counter)
                                 .enrollments);
            dbms_output.put_line('---------------------------------');
        END IF;
    END LOOP;
END;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章