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

Đã trả lại Con trỏ của tôi trong hàm PL / SLQ oracle của tôi nhưng không phải tất cả các hàng đều được trả về. Bạn có thể chỉ trả về 1 hàng trong một hàm Oracle pl / sql không?

Từ tài liệu cho định nghĩa của into_clause : câu lệnh SELECT INTO truy xuất một hoặc nhiều cột từ một hàng và lưu trữ chúng trong một hoặc nhiều biến vô hướng hoặc một biến bản ghi

Sau đó, câu lệnh SELECT hiện tại nên được thay thế đối với các trường hợp trả về nhiều hơn một hàng. Các truy vấn sau có thể là các lựa chọn thay thế cho câu lệnh SQL Select hiện tại của bạn

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;

Nếu phiên bản DB là 12+, thì hãy sử dụng

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

không có truy vấn con để chỉ trả về một hàng, coi như bạn chỉ nhận được các bản sao cho các cột đó mà không có quy tắc sắp xếp dữ liệu. Thông qua việc sử dụng các truy vấn này, không cần xử lý no_data_found hoặc too_many_rows ngoại lệ.

Cập nhật: Nếu mục đích của bạn là trả về tất cả các hàng thậm chí có nhiều hàng cùng một lúc, thì bạn có thể sử dụng SYS_REFCURSOR chẳng hạn như

Các tìm kiếm
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;
/

và gọi theo cách sao cho

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

từ bảng điều khiển của nhà phát triển 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. Sử dụng phạm vi giao dịch và truy vấn

  2. Chèn hàng loạt Oracle bằng SQL Developer

  3. Chuyển đổi mảng byte từ Oracle RAW sang System.Guid?

  4. Gọi Python từ Oracle

  5. ASP.NET - ORA-04068:trạng thái hiện có của các gói đã bị loại bỏ