Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Trả về nhiều giá trị từ hàm Oracle

Cập nhật:

Có, chúng ta có thể sử dụng tham chiếu con trỏ (SYS_REFCURSOR) và OPEN / FETCH / CLOSE thay vì CURSOR và CURSOR FOR LOOP.

Cú pháp là OPEN <cursor-reference> FOR <string-containing-sql-statement> . Xem bên dưới.

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;

Câu trả lời ban đầu:

Rất tiếc, người ta không thể sử dụng SELECT * INTO với tập hợp theo cách này, vì vậy đây là một cách thay thế để điền vào bảng:

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;
/

Đầu ra:

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. LINQPad và Oracle

  2. Khi nào dữ liệu trong bảng tạm thời của phiên Oracle sẽ bị xóa?

  3. Oracle - Sửa đổi một bảng hiện có để tự động tăng một cột

  4. ORA-12505, TNS:người nghe hiện không biết về SID được cung cấp trong kết nối des

  5. cách cập nhật id từ bảng này sang bảng khác