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

Cara mendapatkan data dari fungsi pl/sql jika parameter memiliki lebih dari satu nilai dalam fungsi dengan parameter tunggal

Dengan informasi yang agak terbatas, di bawah ini adalah apa yang saya dapatkan. Saya masih tidak tahu apa yang terjadi dengan Kursor STATIS Anda yang Anda sebutkan dalam pertanyaan Anda didefinisikan dalam f_process_data() Anda Fungsi. Karena saya tidak tahu kode lengkap dalam fungsi ini, saya cukup menulis kode saya sendiri dan mendeklarasikan CURSOR sebagai SYS_REFCURSOR karena itulah fungsi yang dikembalikan.

Tolong beri tahu saya jika ini berhasil atau jika saya melewatkan beberapa informasi penting. Saya merasa kekurangan informasi penting untuk memberikan solusi yang berguna bagi Anda.

Tabel mock-up yang saya buat bernama Produk berisi kolom dan data berikut. Lihat gambar.

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. Tentukan ukuran hasil SQL yang diatur dalam KB

  2. Bagaimana cara mengurai json secara efisien di Oracle 18c?

  3. Hapus anak dan baris induk dengan satu skrip SQL

  4. Nilai Pengikatan Array Oracle.DataAccess (ODP.NET) tidak termasuk dalam kisaran yang diharapkan

  5. Perbarui formulir Apex Tabular dengan PLSQL