2017-08-09 4 views
0

私は従業員の詳細のための関数とオブジェクトを作成しました。この関数は特定の従業員のオブジェクトを返し、返されたオブジェクトからDBMS出力を介して結果を表示します。しかし、私はこれをすることはできません。この問題を解決するために私を助けてください。ORACLEのDBMS出力を持つオブジェクトを出力する方法oracleの関数戻りオブジェクト

タイプ:

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

機能は、特定の従業員

ためのオブジェクトを返します。

いいえ、そうではありません。単一のオブジェクトを含むテーブルを返します。あなたはあなたの関数ではなくオブジェクトを返すようにした場合:

EMP_DETAILS宣言を除去し、直接、新しいオブジェクトを返します(代わりのテーブルにそのオブジェクトを割り当て、テーブルを返す)さ
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; 
/

次に参照名を使用して無名ブロックの作品は、あまりにも固定:あなたがクエリの一部としてオブジェクトを作成することによって、さらに多くの機能を簡素化することができ、あなたがのためにローカル変数を必要としません

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; 
/
関連する問題