如何在PL / SQL中的嵌套记录中获取数据?

时间:2017-05-10 11:25:42

标签: plsql plsqldeveloper

我正在尝试使用嵌套记录示例。 请看声明部分。

DECLARE
  TYPE r_emp IS RECORD (
   name VARCHAR2(50),
   dept_rec departments%ROWTYPE
  );
  r_emp_row r_emp;

BEGIN
  SELECT emp.first_name||' '||emp.last_name,dept.*
  INTO r_emp_row
  FROM   employees emp,departments dept 
  WHERE  emp.department_id = dept.department_id 
  AND    emp.employee_id = 100;

  DBMS_OUTPUT.PUT_LINE('Name:'||r_emp_row.name);
  DBMS_OUTPUT.PUT_LINE('Department ID:'||r_emp_row.dept_rec.department_id);
  DBMS_OUTPUT.PUT_LINE('Department Name:'||r_emp_row.dept_rec.department_name);

EXCEPTION
  when others then
    null;
END;

我正在尝试运行以上阻止,但收到如下错误:

Error report -
ORA-06550: line 10, column 8:
PLS-00597: expression 'R_EMP_ROW' in the INTO list is of wrong type
ORA-06550: line 11, column 3:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 9, column 3:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

您的记录类型r_emp是一个标量属性和一个记录的组合,因此您需要在select into中反映出来。类似的东西:

select emp.first_name||' '||emp.last_name, dept.*
into   r_emp_row.name, r_emp_row.deptrec.dempno, r_emp_row.deptrec.dname ...

与问题无关,when others then null是一个着名的危险建筑:

What is bad in "When Others Then Null" in PL/SQL?
http://www.orafaq.com/wiki/WHEN_OTHERS
http://tkyte.blogspot.co.uk/2008/06/when-others-then-null-redux.html

如果没有员工100怎么办?好吧,它什么都不做 - 也许那没关系。如果有一个员工100但是索引中有一个损坏的块导致查询失败并且 ORA-01578:ORACLE数据块已损坏,或者不是,这取决于执行计划怎么办?它什么都不做,也没有告诉你,你会认为没有员工100。