sql >> データベース >  >> RDS >> Oracle

パラメータが単一のパラメータを持つ関数に複数の値を持っている場合に、pl/sql関数からデータを取得する方法

    やや限られた情報で、以下は私が思いついたものです。質問で言及したSTATICカーソルがf_process_data()で定義されているときに何が起こっているのかまだわかりません。 関数。この関数の完全なコードがわからないので、自分で記述し、関数が返すものとしてCURSORをSYS_REFCURSORとして宣言しました。

    これが機能するかどうか、または重要な情報が不足している場合はお知らせください。有用な解決策を提供するための重要な情報が不足しているように感じます。

    私が作成したProductsというモックアップテーブルには、次の列とデータが含まれています。画像を参照してください。

    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. SpringBatch-レコードをPostgresデータベースに保存できません

    2. Python zlib出力、mysql utf-8テーブルから回復する方法は?

    3. MySQL冗長行のみを選択し、元の行を除外します

    4. Docker内のホストのlocalhostとpostgresの違い