【问题标题】:Oracle pl/sql - Use associative array with user created recordOracle pl/sql - 将关联数组与用户创建的记录一起使用
【发布时间】:2018-05-27 15:30:19
【问题描述】:

我正在尝试将关联数组与用户定义记录的元素类型一起使用。该数组用于打印学生的名字、姓氏和年级。

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 编译错误。 *行动:

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

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

    另外,您可以使用BULK COLLECT INTO,而不是循环遍历CURSOR

    您不能直接将 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;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 2015-07-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多