如何在oracle中从函数返回对象输出oracle中DBMS输出的对象

时间:2017-08-09 06:09:03

标签: oracle plsql oracle11g

我为员工详细信息编写了一个函数和对象。该函数返回特定员工的对象,我想通过返回对象的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 :(得分: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;
/