2017-12-13 5 views
0

사용자 정의 레코드의 요소 유형으로 연관 배열을 사용하려고합니다. 이 배열은 학생의 이름, 성 및 학년을 인쇄합니다.Oracle pl/sql - 사용자 생성 레코드와 연관 배열 사용

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 : 줄 27, 열 : 3 : 표현이 잘못된 유형 ORA-06550의 이다 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

당신은 여기에 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;