Как получить данные из функции pl / sql, если параметр имеет более одного значения в функции с отдельными параметрами - PullRequest
1 голос
/ 24 мая 2019

Я разрабатываю процедуру в pl / sql, которая получает набор данных из курсора, выполняемого в функции. Например:

Функция:

f_process_data(id_process IN NUMBER, id_product IN NUMBER)

Возвращает:

v_result_cursor sys_refcursor;

Но проблема в том, что при поиске курсора мне нужно отправить за раз более одного id_product. Примерно так:

id_product: 1240 (колбаса) id_product: 1260 (ветчина)

¿Как я могу отправить (или получить) более одного продукта в функции?

Я понял, что это возможно с помощью цикла, но как?

Примерно так (?):

v_sausage := 1240;
v_ham := 1260;

LOOP    
   IF v_count = v_sausage OR v_count = v_ham THEN 
   v_result_cursor := f_process_data(1, p_id_product);
   END IF;
   FETCH v_result_cursor
   INTO v_id, v_id_product;
   EXIT WHEN v_result_cursor%NOTFOUND;
END LOOP;

Я ожидал, что v_id и v_id_product были записаны в коллекцию, включающую результаты id_product 1240 и 1260.

Но, если бизнес-правила меняются и это не только 2 продукта, то как насчет 100 или 1000 продуктов?

Примечание: курсор из функции, которую невозможно изменить, id_product должен отправляться один за другим.

CURSOR cu_get_value_products IS
SELECT value FROM supplies WHERE id = p_id and id_product = p_id_product;

Ответы [ 2 ]

1 голос
/ 24 мая 2019

С немного ограниченной информацией я пришел к следующему. Я до сих пор не знаю, что происходит с вашим курсором STATIC, который вы упомянули в своем вопросе, который определен в вашей функции f_process_data(). Поскольку я не знаю полного кода в этой функции, я просто написал свой собственный и объявил CURSOR как SYS_REFCURSOR, поскольку именно это возвращает функция.

Пожалуйста, дайте мне знать, если это работает или мне не хватает важной информации. Мне кажется, что мне не хватает важной информации, чтобы найти для вас полезное решение.

Созданная мной таблица макетов под названием Products содержит следующие столбцы и данные. Смотрите изображение.

enter image description here

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;

enter image description here

0 голосов
/ 24 мая 2019

Чтобы отправлять более одного продукта за один раз, создайте пользовательский тип таблицы в вашей базе данных с именем ProductList. Затем вы можете отправить список продуктов в хранимую процедуру в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...