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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值