2012-12-02 12 views
6

क्या ओरेकल एसक्यूएल प्रक्रिया एक टेबल लौटा सकती है? मैं वर्तमान में एक लूप में मौजूद दो कर्सर के आउटपुट प्रिंट करने के लिए dbms_output का उपयोग कर रहा हूं, हालांकि यह दो कॉलम लौटने पर अच्छा लगेगा। क्या यह एक प्रक्रिया के भीतर संभव होगा?क्या एक एसक्यूएल प्रक्रिया एक टेबल लौटा सकती है?

+0

क्या डेटाबेस का उपयोग कर रहे? – Lee

+0

मैं ओरेकल – Jaqualembo

+0

का उपयोग कर रहा हूं आप प्रक्रिया का उपभोग कैसे कर रहे हैं? आप SYS_REFCURSOR डेटा प्रकार के आउट पैरामीटर के माध्यम से एक कर्सर से एक परिणामसेट वापस कर सकते हैं, लेकिन आपके क्लाइंट को परिणाम सेट पढ़ने का समर्थन करने की आवश्यकता है। –

उत्तर

8

एक पीएल/एसक्यूएल फ़ंक्शन एक घोंसला वाली तालिका वापस कर सकता है। बशर्ते हम नेस्टेड टेबल को SQL प्रकार के रूप में घोषित करें, हम इसे the TABLE() function का उपयोग करके क्वेरी के स्रोत के रूप में उपयोग कर सकते हैं।

create or replace function get_emp_dets (p_dno in emp.deptno%type) 
    return emp_dets_nt 
is 
    return_value emp_dets_nt; 
begin 
    select emp_dets(empno, ename, job) 
    bulk collect into return_value 
    from emp 
    where deptno = p_dno; 
    return return_value; 
end; 
/

SQL> create or replace type emp_dets as object (
    2 empno number, 
    3 ename varchar2(30), 
    4 job varchar2(20)); 
    5/

Type created. 

SQL> create or replace type emp_dets_nt as table of emp_dets; 
    2/

Type created. 

SQL> 

यहाँ एक समारोह जो नेस्टेड तालिका देता है ... ... और यह कैसे है:

यहाँ एक प्रकार, और एक नेस्टेड तालिका यह से बनाया गया है यह काम करता है:

SQL> select * 
    2 from table(get_emp_dets(10)) 
    3/

    EMPNO ENAME       JOB 
---------- ------------------------------ -------------------- 
     7782 CLARK       MANAGER 
     7839 KING       PRESIDENT 
     7934 MILLER       CLERK 

SQL> 

एसक्यूएल प्रकार हमें कार्यक्षमता का एक बड़ा सौदा प्रदान करते हैं, और हमें पीएल/एसक्यूएल में काफी परिष्कृत एपीआई बनाने की अनुमति देते हैं। Find out more

0

यह भी मदद मिल सकती है:

DECLARE 
    TYPE t_emptbl IS TABLE OF scott.emp%rowtype; 
    v_emptbl t_emptbl; 
    ret_val t_emptbl; 
    -- 
    Function getEmployeeList Return t_emptbl 
    IS 
    BEGIN 
    SELECT * bulk collect INTO v_emptbl FROM scott.emp; 
    -- Print nested table of records: 
    FOR i IN 1 .. v_emptbl.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE (v_emptbl(i).empno); 
    END LOOP; 
    RETURN v_emptbl; 
    END; 
    -- 
    BEGIN 
    ret_val:= getEmployeeList; 
    END; 
/
1

मुझे लगता है कि आप (अपने Oracle संस्करण यह समर्थन करता है) इस के लिए Oracle कर्सर का उपयोग कर सकते हैं:

PROCEDURE myprocedure(
    mycursor OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN mycursor FOR SELECT * FROM mytable; 
END; 
END; 
संबंधित मुद्दे