2017-12-08 17 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 

여기 패키지의 얻고있다. 레코드 형식의 모든 열을 선언하는 대신이 방법이 가능한지 여부는 알 수 없습니다.

명시 적으로 컬렉션에 employeesdepartments의 모든 열을 선언해야

답변

1

:

코드에서
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), [10g] (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 등으로 액세스 할 수 있습니다.

답에 대한 귀하의 의견에 답장을 보내지 못했습니다. 대안으로

1

, 당신은 그냥 평평한 구조를하고 커서를 일치하는 레코드 유형을 원하는 경우, 패키지 사양에 커서를 놓고 cursor%rowtype 같은 유형을 정의 할 수 있습니다 :

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;