Oracle pl / sql - 将关联数组与用户创建的记录一起使用

时间:2017-12-13 16:40:39

标签: oracle plsql

我正在尝试使用具有用户定义记录的元素类型的关联数组。此阵列用于打印学生的名字,姓氏和成绩。

SET SERVEROUTPUT ON

DECLARE
TYPE studentRec IS RECORD (
  STUDENT_ID studentdb.student.student_id%TYPE,
  FIRST_NAME STUDENTDB.STUDENT.FIRST_NAME%TYPE,
  LAST_NAME STUDENTDB.STUDENT.LAST_NAME%TYPE,
  GRADE STUDENTDB.GRADE.NUMERIC_GRADE%TYPE
);

CURSOR studentCursor IS
  SELECT STUDENT.STUDENT_ID, STUDENT.FIRST_NAME, STUDENT.LAST_NAME, AVG(GRADE.NUMERIC_GRADE) AS GRADE
  FROM STUDENTDB.STUDENT
  INNER JOIN STUDENTDB.GRADE
  ON STUDENTDB.STUDENT.STUDENT_ID = STUDENTDB.GRADE.STUDENT_ID
  GROUP BY STUDENT.STUDENT_ID, STUDENT.FIRST_NAME, STUDENT.LAST_NAME ;

sr studentRec;

TYPE studentArray IS TABLE OF studentRec INDEX BY PLS_INTEGER;

vars studentArray;

BEGIN


FOR rec IN studentCursor LOOP

  vars(rec.STUDENT_ID) := rec.FIRST_NAME || ' ' || rec.LAST_NAME || ' has grade ' || rec.GRADE;

END LOOP;

FOR ind IN vars.FIRST .. vars.LAST LOOP

DBMS_OUTPUT.PUT_LINE(vars(ind));

END LOOP;



END;

这引发:

  

错误报告 - ORA-06550:第27行,第27列:PLS-00382:表达式为   错误的类型ORA-06550:第27行,第3列:PL / SQL:语句被忽略   ORA-06550:第33行,第1列:PLS-00306:错误的数字或类型   调用'PUT_LINE'ORA-06550时的参数:第33行,第1列:PL / SQL:   声明被忽略了   06550. 00000 - “行%s,列%s:\ n%s”   *原因:通常是PL / SQL编译错误。   *操作:

1 个答案:

答案 0 :(得分:1)

此处您不需要RECORD声明,但如果您知道,可以使用它。最好使用CURSOR%ROWTYPE.语法,如图所示。也不需要关联数组,因为无论如何你的索引都是数字。

此外,您可以使用CURSOR,而不是循环浏览BULK COLLECT INTO

您无法直接将vars(ind)传递给.PUT_LINE()。它应该引用特定的列名。

SET serveroutput ON
DECLARE
    CURSOR studentcursor IS
      SELECT student.student_id,
             student.first_name,
             student.last_name,
             AVG(grade.numeric_grade) AS GRADE
      FROM   studentdb.student
             inner join studentdb.grade
                     ON studentdb.student.student_id =
                        studentdb.grade.student_id
      GROUP  BY student.student_id,
                student.first_name,
                student.last_name;
    TYPE studentarray
      IS TABLE OF studentcursor%ROWTYPE;
    vars STUDENTARRAY;
BEGIN
    OPEN studentcursor;

    FETCH studentcursor BULK COLLECT INTO vars;

    FOR ind IN vars.first .. vars.last LOOP
        dbms_output.put_line(vars(ind).student_id
                             ||','
                             || vars(ind).first_name
                             ||','
                             ||vars(ind).last_name
                             ||','
                             || vars(ind).grade);
    END LOOP;
END;