2017-12-08 13 views
0

私はいつも、私は、デフォルトのHRスキーマにrowtypeを使用してレコードにカーソルをフェッチすることはできますか?

CREATE OR REPLACE PACKAGE EMP_PKG AS 
    TYPE T_EMP_REC IS RECORD (
    V_EMP_TAB EMPLOYEES%ROWTYPE, 
    V_DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE 
); 

    FUNCTION GET_EMP (P_EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE) RETURN T_EMP_REC; 
END EMP_PKG; 
/
CREATE OR REPLACE PACKAGE BODY EMP_PKG AS 
    FUNCTION GET_EMP (P_EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE) 
    RETURN T_EMP_REC 
    AS 
    CURSOR V_EMP_CUR IS 
     SELECT E.*, D.DEPARTMENT_NAME 
     FROM EMPLOYEES E, DEPARTMENTS D 
     WHERE E.EMPLOYEE_ID = P_EMP_ID 
     AND E.DEPARTMENT_ID = D.DEPARTMENT_ID; 

    V_EMP_REC T_EMP_REC; 
    BEGIN 
    OPEN V_EMP_CUR; 
    FETCH V_EMP_CUR INTO V_EMP_REC; 
    CLOSE V_EMP_CUR; 

    RETURN V_EMP_REC; 
    END GET_EMP; 
END EMP_PKG; 

列の一致の数を使用していると私はいつもテーブルと同じタイプを使用しています、

PLS-00597: expression 'V_EMP_REC' in the INTO list is of wrong type 

がここにパッケージだそうです。レコード型の各列を宣言するのではなく、このアプローチが可能かどうかはわかりません。

答えて

1

あなたが明示的にあなたのコレクションにemployeesdepartmentsのすべての列を宣言する必要があります:あなたのコードで

TYPE t_emp_rec IS RECORD (employees_col1 employees.employees_col1%TYPE, 
          employees_col2 employees.employees_col2%TYPE, 
          ... 
          departments_col1 departments.departments_col1%TYPE, 
          departments_col2 departments.departments_col2%TYPE 
          ... 
         ); 

をあなたがエラーを取得you'areは、列の型(NUMBER、VARCHAR2、DATEを割り当てるしようとしているので、 、...)をRECORDコレクションに追加します。

+0

ありがとう!この関数を呼び出すときに、どのようにレコードを印刷できますか? –

+0

@ Rishabh Jainの回答を参照してください。レコードを印刷するには、レコードの各列に明示的にアクセスする必要があります(つまり、DBMS_OUTPUT.PUT_LINE( 'Col1:' || V_EMP_REC.employees_col1 || '、Col2:' || V_EMP_REC.employees_col2 ... ') Oracleドキュメント:[12c](https://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS005)、[11g](https://docs.oracle.com/cd/B28359_01/appdev.111) /b28370/collections.htm#LNPLS005)、 [10グラム(https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/05_colls.htm) – Guillaume

1

Guillaumeが示唆したように、明示的に列名を記述します。関数を呼び出すと、T_EMP_RECレコードが返されます。今度は、各変数にT_EMP_REC.employees_col1、T_EMP_REC.employees_col2、T_EMP_REC.department_col1などのようにアクセスできます。

このように回答にあなたのコメントを返信できません。あなただけのレコードタイプはフラットな構造であることと、カーソルを一致させたい場合は、あなたがパッケージ仕様にカーソルを置き、cursor%rowtypeようなタイプを定義することができます別の方法として

1

、:

create or replace package emp_pkg 
as 
    cursor emp_cur 
     (cp_emp_id employees.employee_id%type) 
    is 
     select e.*, d.department_name 
     from employees e 
       join departments d 
        on e.department_id = d.department_id 
     where e.employee_id = cp_emp_id; 

    subtype t_emp_rec is emp_cur%rowtype; 

    function get_emp 
     (p_emp_id employees.employee_id%type) 
     return t_emp_rec; 

end emp_pkg; 


create or replace package body emp_pkg 
as 
    function get_emp 
     (p_emp_id employees.employee_id%type) 
     return t_emp_rec 
    is 
     v_emp_rec t_emp_rec; 
    begin 
     open emp_cur(p_emp_id); 
     fetch emp_cur into v_emp_rec; 
     close emp_cur; 

     return v_emp_rec; 
    end get_emp; 
end emp_pkg; 
関連する問題