Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengembalikan Kursor saya di fungsi Oracle PL/SLQ saya tetapi tidak semua baris dikembalikan. Bisakah Anda hanya mengembalikan 1 baris dalam fungsi Oracle pl/sql?

Dari dokumentasi untuk definisi into_clause :pernyataan SELECT INTO mengambil satu atau lebih kolom dari satu baris dan menyimpannya dalam satu atau lebih variabel skalar atau satu variabel record

Maka pernyataan SELECT saat ini harus diganti dengan kasus pengembalian lebih dari satu baris. Kueri berikut mungkin menjadi alternatif untuk pernyataan SQL Select Anda saat ini

SELECT reserve_id
  INTO resid
  FROM
  ( SELECT r.*,
           ROW_NUMBER() OVER (ORDER BY 0) AS rn
      FROM reservation
     WHERE Cust_name = cname
       AND Hotel_id = hotelID
       AND reserve_date = resdate
   )
  WHERE rn = 1;

Jika versi DB adalah 12+, maka gunakan

SELECT reserve_id
  INTO resid
  FROM reservation
 WHERE Cust_name = cname
   AND Hotel_id = hotelID
   AND reserve_date = resdate
 FETCH NEXT 1 ROW ONLY; 

tanpa subquery untuk mengembalikan satu baris saja, mengingat Anda hanya mendapatkan duplikat untuk kolom tersebut tanpa aturan pengurutan untuk data. Melalui penggunaan kueri ini, tidak perlu menangani no_data_found atau too_many_rows pengecualian.

Pembaruan : Jika tujuan Anda adalah mengembalikan semua baris meskipun ada lebih dari satu baris sekaligus, maka Anda dapat menggunakan SYS_REFCURSOR seperti

CREATE OR REPLACE FUNCTION findres(cname   reservation.cust_name%type,
                                   hotelID reservation.hotel_id%type,
                                   resdate reservation.reserve_date%type)
  RETURN SYS_REFCURSOR IS
  recordset SYS_REFCURSOR;
BEGIN
  OPEN recordset FOR
  SELECT reserve_id
    FROM reservation
   WHERE Cust_name = cname
     AND Hotel_id = hotelID 
     AND reserve_date = resdate;

  RETURN recordset;
END;
/

dan panggil sedemikian rupa sehingga

VAR   v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc

dari konsol Pengembang SQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan kueri di Oracle:Nama tabel tidak valid

  2. Memahami aliasing Oracle - mengapa alias tidak dikenali dalam kueri kecuali dibungkus dengan kueri kedua?

  3. Simulasi OLAP

  4. Bagaimana cara mengompres hasil Oracle ini menjadi nilai sesuai dengan prioritas baris, mengabaikan nol?

  5. Mendeklarasikan &Mengatur Variabel dalam Pernyataan Pilih