2017-08-09 119 views
0

我爲員工詳細信息編寫了一個函數和對象。該函數爲特定的員工返回一個對象,我想通過返回對象的DBMS輸出顯示結果。但我不能這樣做。請幫我解決這個問題。如何使用oracle中的函數返回對象在oracle中輸出具有DBMS輸出的對象

類型:

CREATE OR REPLACE TYPE EMP_DETAILS_OBJ AS OBJECT(
    EMPID NUMBER, 
    ENAME VARCHAR2(100), 
    DESIGNATION VARCHAR2(100), 
    DEPARTMENT VARCHAR2(50), 
    JOIN_DATE DATE, 
    COUNTRY VARCHAR2(50), 
    REGION VARCHAR2(30) 
) 
/

CREATE OR REPLACE TYPE EMP_DETAILS_TABLE IS TABLE OF EMP_DETAILS_OBJ 
/

功能:

CREATE OR REPLACE FUNCTION GETEMPLOYEE_INFO(SEARCH_EMPLOYEE_ID NUMBER) 
RETURN EMP_DETAILS_TABLE IS 
    EMPLOYEEID NUMBER; 
    EMPLOYEE_NAME VARCHAR2(100); 
    DESIGNATION VARCHAR2(100); 
    DEPARTMENT VARCHAR2(50); 
    JOIN_DATE DATE; 
    COUNTRY VARCHAR2(50); 
    REGION VARCHAR2(30); 
    EMP_DETAILS EMP_DETAILS_TABLE := EMP_DETAILS_TABLE(); 
BEGIN 
    EMP_DETAILS.EXTEND(); 

    SELECT EMP.EMPLOYEE_ID, 
    EMP.FIRST_NAME||' '||EMP.LAST_NAME, 
    EMPJOB.JOB_TITLE, 
    DEPT.DEPARTMENT_NAME, 
    EMP.HIRE_DATE, 
    CNTRY.COUNTRY_NAME, 
    RGN.REGION_NAME 
    INTO EMPLOYEEID, EMPLOYEE_NAME, DESIGNATION, DEPARTMENT, JOIN_DATE, 
    COUNTRY, REGION 
    FROM EMPLOYEES EMP 
    LEFT OUTER JOIN JOBS EMPJOB ON EMPJOB.JOB_ID = EMP.JOB_ID 
    LEFT OUTER JOIN DEPARTMENTS DEPT ON DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID 
    LEFT OUTER JOIN LOCATIONS LOC ON LOC.LOCATION_ID = DEPT.LOCATION_ID 
    LEFT OUTER JOIN COUNTRIES CNTRY ON CNTRY.COUNTRY_ID = LOC.COUNTRY_ID 
    LEFT OUTER JOIN REGIONS RGN ON RGN.REGION_ID = CNTRY.REGION_ID 
    WHERE EMP.EMPLOYEE_ID = SEARCH_EMPLOYEE_ID ; 

    EMP_DETAILS(1) := EMP_DETAILS_OBJ(EMPLOYEEID, EMPLOYEE_NAME, DESIGNATION, 
    DEPARTMENT, JOIN_DATE, COUNTRY, REGION); 

    RETURN EMP_DETAILS; 
END; 
/

呼叫:

SET SERVEROUTPUT ON; 
DECLARE 
    --EMP_DETAILS EMP_DETAILS_TABLE :=EMP_DETAILS_TABLE(); 
    EMP_OBJ EMP_DETAILS_OBJ; 
BEGIN 
    EMP_OBJ :=GETEMPLOYEE_INFO(100); 
    --EMP_OBJ :=EMP_DETAILS_OBJ(EMP_DETAILS.EMPID,EMP_DETAILS.ENAME,EMP_DETAILS.DESIGNATION,EMP_DETAILS.DEPARTMENT,EMP_DETAILS.JOIN_DATE,EMP_DETAILS.COUNTRY,EMP_DETAILS.REGION); 

    DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID: '||EMP_OBJ.EMPID); 
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE_NAME: '); 
    DBMS_OUTPUT.PUT_LINE('DESIGNATION: '); 
    DBMS_OUTPUT.PUT_LINE('DEPARTMENT: '); 
    DBMS_OUTPUT.PUT_LINE('JOIN DATE: '||EMP_DETAILS.JOIN_DATE); 
    DBMS_OUTPUT.PUT_LINE('COUNTRY: '||EMP_DETAILS.COUNTRY); 
    DBMS_OUTPUT.PUT_LINE('REGION: '||EMP_DETAILS.REGION); 
END; 
/

SELECT GETEMPLOYEE_INFO(100) FROM DUAL; 
+1

要回答這個問題,我們需要更多的信息,例如,你得到什麼錯誤或當你運行這個時會發生什麼。跳到我身上的一件事是你的函數返回一個對象表,你把這個變量放入一個單獨的對象而不是一個對象表。 –

+0

當我運行查詢來查看pl/sql中的結果時,出現一個錯誤,表明EMPID沒有聲明。但我已經宣佈了一個對象。那麼如何通過調用GETEMPLOYEE_INFO函數在DBMS OUTPUT中的對象詳細信息中顯示輸出 –

+0

函數EMPLOYEEID,EMPLOYEE_NAME,DESIGNATION,DEPARTMENT,JOIN_DATE,COUNTRY,REGION'中的這些變量的聲明位於何處.Oracle引用了這些聲明。 – XING

回答

0

該函數返回一個對象爲特定僱員

不,它不。它返回一個包含單個對象的表。如果你讓你的函數返回一個對象,而不是:

CREATE OR REPLACE FUNCTION GETEMPLOYEE_INFO(SEARCH_EMPLOYEE_ID NUMBER) 
RETURN EMP_DETAILS_OBJ IS 
    EMPLOYEEID NUMBER; 
    EMPLOYEE_NAME VARCHAR2(100); 
    DESIGNATION VARCHAR2(100); 
    DEPARTMENT VARCHAR2(50); 
    JOIN_DATE DATE; 
    COUNTRY VARCHAR2(50); 
    REGION VARCHAR2(30); 
BEGIN 
    SELECT EMP.EMPLOYEE_ID, 
    EMP.FIRST_NAME||' '||EMP.LAST_NAME, 
    EMPJOB.JOB_TITLE, 
    DEPT.DEPARTMENT_NAME, 
    EMP.HIRE_DATE, 
    CNTRY.COUNTRY_NAME, 
    RGN.REGION_NAME 
    INTO EMPLOYEEID, EMPLOYEE_NAME, DESIGNATION, DEPARTMENT, JOIN_DATE, 
    COUNTRY, REGION 
    FROM EMPLOYEES EMP 
    LEFT OUTER JOIN JOBS EMPJOB ON EMPJOB.JOB_ID = EMP.JOB_ID 
    LEFT OUTER JOIN DEPARTMENTS DEPT ON DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID 
    LEFT OUTER JOIN LOCATIONS LOC ON LOC.LOCATION_ID = DEPT.LOCATION_ID 
    LEFT OUTER JOIN COUNTRIES CNTRY ON CNTRY.COUNTRY_ID = LOC.COUNTRY_ID 
    LEFT OUTER JOIN REGIONS RGN ON RGN.REGION_ID = CNTRY.REGION_ID 
    WHERE EMP.EMPLOYEE_ID = SEARCH_EMPLOYEE_ID ; 

    RETURN EMP_DETAILS_OBJ(EMPLOYEEID, EMPLOYEE_NAME, DESIGNATION, 
    DEPARTMENT, JOIN_DATE, COUNTRY, REGION); 
END; 
/

也就是說,除去EMP_DETAILS聲明,並直接返回一個新的對象(而不是分配給該對象表並返回表)。

然後您的匿名塊的工作,與基準名稱定得:

SET SERVEROUTPUT ON; 
DECLARE 
    EMP_OBJ EMP_DETAILS_OBJ; 
BEGIN 
    EMP_OBJ := GETEMPLOYEE_INFO(100); 

    DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID: ' ||EMP_OBJ.EMPID); 
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE_NAME: ' ||EMP_OBJ.ENAME); 
    DBMS_OUTPUT.PUT_LINE('DESIGNATION: ' ||EMP_OBJ.DESIGNATION); 
    DBMS_OUTPUT.PUT_LINE('DEPARTMENT: ' ||EMP_OBJ.DEPARTMENT); 
    DBMS_OUTPUT.PUT_LINE('JOIN DATE: ' ||EMP_OBJ.JOIN_DATE); 
    DBMS_OUTPUT.PUT_LINE('COUNTRY: ' ||EMP_OBJ.COUNTRY); 
    DBMS_OUTPUT.PUT_LINE('REGION: ' ||EMP_OBJ.REGION); 
END; 
/

EMPLOYEE_ID: 100 
EMPLOYEE_NAME: Steven King 
DESIGNATION: President 
DEPARTMENT: Executive 
JOIN DATE: 17-JUN-87 
COUNTRY: United States of America 
REGION: Americas 

PL/SQL procedure successfully completed. 

你可以通過創建對象作爲查詢的一部分,更簡化的功能,所以你不需要爲局部變量每列/欄:

CREATE OR REPLACE FUNCTION GETEMPLOYEE_INFO(SEARCH_EMPLOYEE_ID NUMBER) 
RETURN EMP_DETAILS_OBJ IS 
    L_EMP_DETAILS_OBJ EMP_DETAILS_OBJ; 
BEGIN 
    SELECT EMP_DETAILS_OBJ(EMP.EMPLOYEE_ID, 
    EMP.FIRST_NAME||' '||EMP.LAST_NAME, 
    EMPJOB.JOB_TITLE, 
    DEPT.DEPARTMENT_NAME, 
    EMP.HIRE_DATE, 
    CNTRY.COUNTRY_NAME, 
    RGN.REGION_NAME) 
    INTO L_EMP_DETAILS_OBJ 
    FROM EMPLOYEES EMP 
    LEFT OUTER JOIN JOBS EMPJOB ON EMPJOB.JOB_ID = EMP.JOB_ID 
    LEFT OUTER JOIN DEPARTMENTS DEPT ON DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID 
    LEFT OUTER JOIN LOCATIONS LOC ON LOC.LOCATION_ID = DEPT.LOCATION_ID 
    LEFT OUTER JOIN COUNTRIES CNTRY ON CNTRY.COUNTRY_ID = LOC.COUNTRY_ID 
    LEFT OUTER JOIN REGIONS RGN ON RGN.REGION_ID = CNTRY.REGION_ID 
    WHERE EMP.EMPLOYEE_ID = SEARCH_EMPLOYEE_ID ; 

    RETURN L_EMP_DETAILS_OBJ; 
END; 
/