2017-12-13 7 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:式が間違った型ORA-06550の です:行27、列3:PLを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;