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

Cách lấy dữ liệu từ một hàm pl / sql nếu một tham số có nhiều hơn một giá trị trong hàm với một tham số

Với thông tin hơi hạn chế, dưới đây là những gì tôi nghĩ ra. Tôi vẫn không biết điều gì đang xảy ra với Con trỏ STATIC của bạn mà bạn đã đề cập trong câu hỏi của mình được xác định trong f_process_data() của bạn Hàm số. Vì tôi không biết mã đầy đủ trong hàm này nên tôi chỉ cần viết mã của riêng mình và khai báo CURSOR là SYS_REFCURSOR vì đó là hàm trả về.

Vui lòng cho tôi biết nếu điều này hoạt động hoặc nếu tôi thiếu một số thông tin quan trọng. Tôi cảm thấy như mình đang thiếu thông tin quan trọng để cung cấp giải pháp hữu ích cho bạn.

Bảng mô phỏng mà tôi đã tạo có tên Sản phẩm chứa các cột và dữ liệu sau. Xem hình ảnh.

DECLARE

  /* Store Ref Cursor returned by f_process_data() Function */
  v_result_cursor   SYS_REFCURSOR;

  /* Declare Record so we can store the data FETCHed from the Cursor */
  rec_products      products%ROWTYPE;

  /* Declare a couple Product Variables for Proof of Concept */
  v_sausage         NUMBER;
  v_ham             NUMBER;

  /* Store output */
  n_id              NUMBER;
  v_id_product      VARCHAR2(100);

  /* Declare Type of TABLE NUMBER */
  TYPE  nt_type IS TABLE OF NUMBER;

  /* Create Array/Table/Collection of type nt_type to store product ids */
  nt_product_ids    nt_type;

  /* Returns a Ref Cursor based on the product_id used as Input to this function */
  FUNCTION f_process_data(p_id_process IN NUMBER, p_id_product IN NUMBER)
  RETURN SYS_REFCURSOR
  AS
    /* Declare Ref Cursor that will be Returned */
    rc_result_cursor   SYS_REFCURSOR;    

  BEGIN 
    /* Open Ref Cursor based on Product ID parameter */
    OPEN rc_result_cursor FOR SELECT * FROM products WHERE item_id = p_id_product;

    RETURN rc_result_cursor;

  END f_process_data
  ;

BEGIN

  /* Set Product Variables to IDs */
  v_sausage       := 2002;
  v_ham           := 2009;

  /* Store product ids into a Number Table so we can Loop thru it */
  nt_product_ids  :=  nt_type (v_sausage,v_ham);

  FOR r IN nt_product_ids.FIRST .. nt_product_ids.LAST
  LOOP
    /* Get Ref Cursor using SINGLE Product ID */
    v_result_cursor := f_process_data(1, nt_product_ids(r));

    LOOP

    FETCH v_result_cursor INTO rec_products;

    n_id            :=  rec_products.item_id;
    v_id_product    :=  rec_products.item;

    EXIT WHEN v_result_cursor%NOTFOUND;

    dbms_output.put_line('Product_id: ' || n_id);
    dbms_output.put_line('Product: ' || v_id_product);  

    END LOOP; /* Cursor Loop */

    /* Close Cursor */
    CLOSE v_result_cursor;

  END LOOP; /* Product IDs Loop */

EXCEPTION WHEN OTHERS
  THEN CLOSE v_result_cursor;

END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kết nối oci_connect không thành công

  2. Làm cách nào để tìm các giá trị trùng lặp trong bảng trong Oracle?

  3. Cách cập nhật ID trong bảng 2 từ bảng 1 trong Oracle sql

  4. Cách thêm 10 giây trong SQL current_timestamp (Oracle)

  5. Dấu thời gian Oracle, Giá trị tối đa và tối thiểu