2016-02-05 17 views
1

我在PL/SQL编写的程序,并希望返回一个EMP类型的对象。有可能这样做吗?如果是,我该怎么办?如何设置一个对象作为out参数?

下面是代码:

CREATE OR REPLACE 
PROCEDURE get_emp_rs (p_deptno IN emp.deptno%TYPE, 
         p_recordset OUT emp_det) AS 

    emp_details emp_det; 
BEGIN 
    OPEN p_recordset FOR 
    SELECT ename, 
      empno 
    FROM emp 
    WHERE deptno = p_deptno 
    ORDER BY ename; 

    fetch p_recordset into emp_details; 
    --exit when p_recordset%notfound; 
    --end loop; 
    --for indx in p_recordset 
    --loop 
    emp_details.ename:= 'test'; 
    --end loop; 
END get_emp_rs; 
/

SET SERVEROUTPUT ON SIZE 1000000 
    DECLARE 
     l_cursor emp_det; 
     --l_cur emp_det; 
     --l_ename emp.ename%TYPE; 
     --l_empno emp.empno%TYPE; 
     l_deptno emp.deptno%TYPE; 
    BEGIN 
    l_cur:=get_emp_rs ('30', 
        l_cursor); 
       dbms_output.put_line('low'); 
     /*LOOP 
     FETCH l_cursor 
     INTO l_ename, l_empno, l_deptno; 
     EXIT WHEN l_cursor%NOTFOUND;*/ 
     DBMS_OUTPUT.PUT_LINE(l_cursor.ename || ' | ' || l_cursor.empno); 
    end; 
    /

我想要得到的enameempno后,终于在程序更新。 我该怎么办?如果有更好的方法,请给我建议。

还请大家建议我怎么能这样做。我不能在这里使用任何功能,这是唯一的义务。也请让我知道是否有这样做的方式使用。

+1

如何'emp_det'声明?你说这是一个对象,但是'l_cursor'表明它是一个ref cursor? –

+0

emp_det是我创建了一个对象类型。它有两个属性ename和empo。如果我使用lcursor作为refcursor,有一种方法可以通过它返回记录集。 –

回答

0

在您的例子(表EMP)单EMP记录不应该被部门编号进行选择。改用EMPNO。

下面是一个快速的解决方案,并希望自我解释的:

SET SERVEROUTPUT ON; 
SET FEEDBACK OFF; 
CLEAR; 

--Define the dataset object 
CREATE TYPE EMP_DET AS OBJECT (
EMPNO NUMBER(4), 
ENAME VARCHAR2(10) 
); 
/

--Define a collection of dataset objects 
CREATE TYPE EMP_DET_LIST IS TABLE OF EMP_DET; 
/


--Get a SINGLE record into the OUT-Variable identified by EMP PK EMPNO 
CREATE OR REPLACE PROCEDURE GET_EMP_RS(P_EMPNO  IN EMP.EMPNO%TYPE, 
             P_RECORDSET IN OUT EMP_DET) AS 
BEGIN 
    --Create the return object inside SQL 
    SELECT EMP_DET(EMPNO, ENAME) 
    INTO P_RECORDSET 
    FROM EMP 
    WHERE EMPNO = P_EMPNO; 

    P_RECORDSET.ENAME := 'test'; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    --Return NULL if employee not found 
    P_RECORDSET := NULL; 
END GET_EMP_RS; 
/

--Get a LIST OF employees by department 
CREATE OR REPLACE PROCEDURE GET_EMP_LIST(P_DEPTNO  IN EMP.DEPTNO%TYPE, 
             P_RECORDLIST OUT EMP_DET_LIST) AS 
    TYPE C_CURSOR IS REF CURSOR; -- <-- For the explicit cursor solution only 
    C_EMP_RS C_CURSOR;   -- <-- For the explicit cursor solution only 
    V_RS  EMP_DET;   -- <-- For the explicit cursor solution only 

BEGIN 
    --Initialize out object 
    P_RECORDLIST := EMP_DET_LIST(); 

    --Create the return object inside SQL 
    --via bulk collect 
    /* 
    SELECT EMP_DET(EMPNO,ENAME) 
    BULK COLLECT INTO INTO P_RECORDLIST 
    FROM EMP 
    WHERE DEPTNO = P_DEPTNO; 
    */ 

    --with manipulation of records 
    --use a FOR-LOOP with implizit cursor 
    /* 
    FOR L_RS IN (SELECT EMP_DET(EMPNO, ENAME) EMP_RS 
       FROM EMP 
       WHERE DEPTNO = P_DEPTNO) LOOP 
    L_RS.EMP_RS.ENAME := 'TEST'; 
    P_RECORDLIST.EXTEND; 
    P_RECORDLIST(P_RECORDLIST.LAST) := L_RS.EMP_RS; 
    NULL; 
    END LOOP; 
    */ 

    --or define an explicit cursor and LOOP-FETCH 

    OPEN C_EMP_RS FOR 
    SELECT EMP_DET(EMPNO, ENAME) EMP_RS 
    FROM EMP 
    WHERE DEPTNO = P_DEPTNO; 
    LOOP 
    FETCH C_EMP_RS 
     INTO V_RS; 
    EXIT WHEN C_EMP_RS%NOTFOUND; 
    V_RS.ENAME := 'TEST'; 
    P_RECORDLIST.EXTEND; 
    P_RECORDLIST(P_RECORDLIST.LAST) := V_RS; 
    END LOOP; 
    CLOSE C_EMP_RS; 

END GET_EMP_LIST; 
/

--************************** 
-- Test 
--************************** 
DECLARE 
    L_CURSOR EMP_DET; 
    L_LIST EMP_DET_LIST; 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('---- Single EMP ----'); 

    GET_EMP_RS(7369, L_CURSOR); 

    IF (L_CURSOR IS NOT NULL) THEN 
    DBMS_OUTPUT.PUT_LINE(L_CURSOR.ENAME || ' | ' || L_CURSOR.EMPNO); 
    END IF; 

    DBMS_OUTPUT.PUT_LINE('---- EMP List ----'); 

    GET_EMP_LIST(30, L_LIST); 

    IF (L_LIST.count > 0) THEN 
    FOR L_I IN L_LIST.FIRST .. L_LIST.LAST LOOP 
     DBMS_OUTPUT.PUT_LINE(L_LIST(L_I).ENAME || ' | ' || L_LIST(L_I).EMPNO); 

    END LOOP; 
    END IF; 

END; 
/


DROP PROCEDURE GET_EMP_RS; 
DROP PROCEDURE GET_EMP_LIST; 
DROP TYPE EMP_DET_LIST; 
DROP TYPE EMP_DET; 

输出:

---- Single EMP ---- 
test | 7369 
---- EMP List ---- 
TEST | 7499 
TEST | 7521 
TEST | 7654 
TEST | 7698 
TEST | 7844 
TEST | 7900 

SQL> 
相关问题