2017-05-10 77 views
1

我正在嘗試嵌套記錄示例。 請看看聲明部分。如何在PL/SQL的嵌套記錄中獲取數據?

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. 

幫助表示讚賞。

+0

這種結構的目的是什麼?也許你可以使用'FOR LOOP語句' '來簡化這個操作rec in(select * from xxx)loop rec.column_name end loop; ' –

+0

是的,我知道FOR LOOP語句,並且它更喜歡嵌套記錄。此查詢是在培訓會議期間提出的。 –

回答

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.

+0

「當其他人無效是一個着名的危險建築:」是的,我同意你的意見。然而,這一點與異常部分無關,相反,問題與填充嵌套記錄以及如何執行相關? –

+0

無論如何,你的建議幫助! –

+0

我的答案從如何做'select into'開始。我剛剛添加了一個關於異常啓動器'btw ...'的評論,但可以跳過這一點,並專注於第一部分。 –