2013-02-07 65 views
1

我想知道如何使用記錄類型中的PL/SQL返回多個值。如何返回記錄類型中的多個值

下面是我的示例代碼: -

CREATE OR REPLACE FUNCTION "FN_TESTING" 
(
    TESTING1 IN VARCHAR2 
) RETURN TEST4_TEST as 

TEST2 TEST4_TEST%ROWTYPE; 

CURSOR TEST1 IS 
SELECT '1','2' FROM DUAL; 

BEGIN 
OPEN TEST1; 
    FETCH TEST1 
    INTO TEST2; 
    CLOSE TEST1; 

RETURN TEST2; 
END FN_TESTING; 

我檢查我的功能,它讓我警告,我TEST4_TEST必須聲明的消息。

我知道這個功能有什麼問題嗎?以及我如何爲TEST4_TEST做宣言?

回答

1

是的,我們可以從PLSQL函數/過程返回記錄變量。但首先它必須被宣佈。

create or replace function get_employee 
(p_empl_no in employee.empl_no%type) 
return employee%rowtype 
as 
l_cust_record employee%rowtype; 
begin 
select * into l_cust_record from employee 
where empl_no = p_empl_no; 
return(l_cust_record); 
end; 
/
+0

可我知道你提到的是對象或參數傳中的員工? – weikuan86

+0

現在我面臨這個問題FUNCTION GET_EMPLOYEE的編譯錯誤錯誤:PLS-00310:使用%ROWTYPE屬性,'EMPLOYEE'必須命名一個表,光標或光標變量行:4文本:返回僱員%rowtype是錯誤:PL/SQL :編譯單元分析終止Line:1 Text:創建或替換函數get_employee(F_CONTRACT_TYP in varchar2, – weikuan86

+1

)hi employee是表名,必須存在於您的數據庫中。 – user2001117

0

嘗試,這也:

declare TYPE t_deptrec IS RECORD 
(
    name dept.dname%type, 
    location dept.loc%type 
); 

CURSOR c_emp is 

select ename,deptno from emp; 
r_dept t_deptrec; 

function getDept(p_deptno dept.deptno%type) return t_deptrec is 
r_dept t_deptrec; 

begin 
    select dname,loc into r_dept 
    from dept where deptno = p_deptno; 

    return r_dept; 
end; 

BEGIN 
    for r_emp in c_emp 
    loop 

     r_dept := getDept(r_emp.deptno); 
     dbms_output.put_line(r_emp.ename || ',' || r_dept.name || ',' || r_dept.location); 

    end loop; 
END; 
0

想想TEST4_TEST作爲一個變量,它是記錄的類型。這個變量就像NUMBER,VARCHAR,DATE一樣。唯一不同的是,這些已經由Oracle定義,但在收集和記錄的情況下,我們必須定義我們自己的。 按照您的例子似乎要返回的記錄與2號值,那麼你應該定義爲遵循

CREATE OR REPLACE PACKAGE TEST4_TEST1 
AS 
TYPE TEST4_TEST Is record 
(
COL1 INTEGER, 
COL2 INTEGER 
); 
END; 

CREATE OR REPLACE FUNCTION FN_TESTING (testing1 IN VARCHAR2) 
    RETURN TEST4_TEST1.test4_test 
AS 
test3 TEST4_TEST1.test4_test; 


    CURSOR test2 
    IS 
     SELECT '1', '2' FROM DUAL; 
A 
BEGIN 
    OPEN test2; 
    FETCH test2 INTO test3; 
    CLOSE test2; 
    RETURN test3; 
END fn_testing;