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

Oracle फ़ंक्शन से एकाधिक मान लौटाएं

अपडेट करें:

हां, हम CURSOR और CURSOR FOR LOOP के बजाय एक कर्सर संदर्भ (SYS_REFCURSOR) और OPEN/FETCH/CLOSE का उपयोग कर सकते हैं।

सिंटैक्स OPEN <cursor-reference> FOR <string-containing-sql-statement> के लिए है . नीचे देखें।

CREATE OR REPLACE FUNCTION load_test_object_sn
RETURN test_otable_sn
AS  
  details test_otable_sn := test_otable_sn();

  -- Variable stores SQL statement for cursor
  l_sql CLOB :=
    q'[with ad as (
         select 'a' column_1, 'b' column_2, 4 column_3 from dual union all
         select 'r', '5', 3  from dual union all 
         select 'g', 's', 3  from dual
       )
       select *
         from ad]';

  -- Cursor reference allows us to open cursor for SQL statement above
  rc SYS_REFCURSOR;

  -- Define object instance to store each row fetched from the cursor
  l_obj test_object_sn := test_object_sn(NULL, NULL, NULL);

  i PLS_INTEGER := 1;
BEGIN

  -- Explicitly open, fetch from, and close the cursor
  OPEN rc FOR l_sql;
  LOOP
    FETCH rc INTO l_obj.column_1, l_obj.column_2, l_obj.column_3;
    EXIT WHEN rc%NOTFOUND;
    details.extend();
    details(i) := test_object_sn(l_obj.column_1, l_obj.column_2, l_obj.column_3);
    i := i + 1;
  END LOOP;
  CLOSE rc;

  RETURN details;
END;

मूल उत्तर:

दुर्भाग्य से, कोई इस तरह से संग्रह के साथ SELECT * INTO का उपयोग नहीं कर सकता है, इसलिए तालिका को पॉप्युलेट करने का एक वैकल्पिक तरीका यहां दिया गया है:

create or replace function load_test_object_sn
return test_otable_sn
as  
    details test_otable_sn := test_otable_sn();
    cursor c_ad is
    with ad as (select 'a' column_1, 'b' column_2, 4 column_3   from dual
    union all 
    select 'r', '5', 3  from dual
    union all
    select 'g', 's', 3  from dual)
    select * from ad;
    i pls_integer := 1;

begin

   for ad_rec in c_ad loop     
      details.extend();
      details(i) := test_object_sn(ad_rec.column_1, ad_rec.column_2, ad_rec.column_3);
      i := i + 1;
   end loop;

    return details;
end;
/

आउटपुट:

SQL> SELECT * FROM TABLE(load_test_object_sn);

COLUMN_1   COLUMN_2     COLUMN_3
---------- ---------- ----------
a          b                   4
r          5                   3
g          s                   3



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. निरंतर समूहीकरण के लिए Oracle SQL

  2. SQL राष्ट्रीय चरित्र (NCHAR) डेटाटाइप वास्तव में किसके लिए है?

  3. Concat फ़ंक्शन काम नहीं कर रहा है - तर्कों की अमान्य संख्या

  4. SQL लोडर त्रुटि:चर लंबाई फ़ील्ड अधिकतम लंबाई से अधिक है।

  5. हाइबरनेट> सीएलओबी> ओरेकल :(