Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

सीटीई से ओरेकल टेबल फंक्शन

Objects . के साथ व्यवहार करते समय select . बनाते समय आप अतिरिक्त सावधानी बरतें . आपके कोड में त्रुटियां थीं जिसके परिणामस्वरूप समस्याएं थीं। यह भी सुनिश्चित नहीं है कि नीचे दिए गए प्रत्यक्ष असाइनमेंट की वास्तव में अनुमति है या नहीं:

rec := PART_TEST(record);

हालाँकि मैं यहाँ 2 समाधान प्रस्तावित करता हूँ। सबसे पहले Pipeline . के साथ और इसके बिना अन्य। नीचे देखें:

--तालिका और वस्तु तैयार करना

CREATE TABLE part_table (
    part_no   NUMBER,
    col1      NUMBER
);

INSERT INTO PART_TABLE VALUES(1,11);
INSERT INTO PART_TABLE VALUES(1,33);
INSERT INTO PART_TABLE VALUES(2,22);

SELECT * FROM PART_TABLE;

CREATE OR REPLACE TYPE part_test IS OBJECT (
    part_no   NUMBER,
    col1      NUMBER
);

CREATE OR REPLACE TYPE part_test_t IS  TABLE OF part_test;
/

--पाइपलाइन के साथ कार्य करें

CREATE OR replace FUNCTION part_test_f(search_part IN number)
RETURN part_test_t PIPELINED 
AS 

 rec part_test; --<--Variable of type Object since we want to piperow.

 CURSOR cur(part_num number) IS 
      WITH A AS 
      (       --Make sure you cast your select statement of object type    
              SELECT part_test(PART_NO,col1) FROM PART_TABLE WHERE PART_NO LIKE part_num
       )
       SELECT * FROM A;        
BEGIN        
   OPEN cur(search_part) ;
    LOOP
      Fetch cur into rec;    --<-- Note here am not using `Bulk Collect` even though its being a collection since we are `piping` the rows.    
      exit when cur%NOTFOUND;
       pipe row(rec);         
    END LOOP;
RETURN ;
END;
/

परिणाम:

SQL> SELECT * FROM TABLE (PART_TEST_F(1));

     PART_NO       COL1
    ---------- ----------
      1            11
      1            33

--पाइपलाइन के बिना

CREATE OR REPLACE FUNCTION part_test_f (search_part IN NUMBER) 
RETURN part_test_t 
 AS
    rec   part_test_t;
    CURSOR cur ( part_num NUMBER) IS 
    WITH a AS 
    ( SELECT part_test( part_no,col1 )
       FROM part_table
       WHERE part_no LIKE part_num       
    ) 
    SELECT *  FROM a;
BEGIN
    OPEN cur(search_part);
    LOOP
        FETCH cur BULK COLLECT INTO rec;
        EXIT WHEN cur%notfound;      
    END LOOP;
    RETURN rec;
END;
/

परिणाम:

SQL> Select * from table (part_test_f(1));

   PART_NO       COL1
---------- ----------
         1         11
         1         33

जो भी आपको सूट करे उसे चुनें लेकिन हम सभी Pipeline . का उपयोग करने के फायदे जानते हैं इसलिए कार्य करता है जो सबसे उपयुक्त होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या जेपीए एंटिटीज, ओरेकल 10 जी और कैलेंडर टाइप प्रॉपर्टीज में कोई समस्या है?

  2. ऑटो कमिट के साथ ऑरैकल टेबल बनाएं

  3. अजगर से Oracle DB के लिए कनेक्शन टाइमआउट पैरामीटर

  4. Oracle में एक पंक्ति के अस्तित्व की जाँच करने के लिए सबसे तेज़ क्वेरी?

  5. Oracle में जॉइन क्वेरी के साथ अपडेट करें