Oracle чтение и возврат данных из курсора - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь создать хранимую процедуру в Oracle, которая имеет один входной параметр и одну выходную переменную и, в случае результатов, возвращает набор данных в мое приложение. Net. Основная проблема заключается в том, что я не могу изменить сигнатуру процедуры, и мне нужно выполнить условие, чтобы проверить, существуют ли записи или нет. Основная проблема, с которой я столкнулся, связана с курсорами (для выполнения и возврата информации) и для подсчета результатов выбора.

Вот пример того, что я делаю, чтобы попытаться получить данные.

CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID NUMBER(1))
AS

   TYPE v_record_botoes IS RECORD (
        v_dummy_col1 VARCHAR2(50),
        v_dummy_col2 VARCHAR2(250)
    );
   TYPE table_botoes IS TABLE OF v_record_botoes;
   tt_botoes table_botoes;

   v_ref_cursor SYS_REFCURSOR;

   CURSOR v_cursor IS
     (SELECT dt.v_dummy_col1,
           dt.v_dummy_col2
    FROM dummy_table dt
         WHERE v_dummy_col3 = v_input);

   v_check NUMBER;

BEGIN
   tt_botoes := table_botoes();
   v_check := 0;

   FOR v_row IN v_cursor
   LOOP
      tt_botoes.extend;
      tt_botoes(tt_botoes.COUNT) := v_row;
   END LOOP;

   v_check := tt_botoes.COUNT;

   -- condition that need to know the nr of records of the select
   IF v_check = 0 THEN

      v_OutID := 0;

   ELSE

      v_OutID := 1;

      OPEN v_ref_cursor FOR
      SELECT *
         FROM tt_botoes; -- also tryed "FROM TABLE (tt_botoes)" and "FROM TABLE (cast(tt_botoes AS table_botoes))"

      -- return dataset to .net application
      DBMS_SQL.RETURN_RESULT(v_ref_cursor)

   END IF;

END;

Уже пытались преобразовать v_cursor в sys_refcursor , который будет выдан пакетом DBMS_ SQL , но не получил нигде Также я попытался создать временную таблицу для хранения информации, но затем возникла проблема с параллелизмом.

Есть идеи, что я делаю неправильно, или есть какое-либо другое возможное решение для решения этой проблемы?

Заранее спасибо

1 Ответ

0 голосов
/ 06 марта 2020

Полностью не проверено, потому что у меня нет среды для его тестирования, но я бы структурировал это совсем по-другому, см. Ниже (я предполагаю, что упущение в спецификации - просто опечатка)

CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID **out** NUMBER(1))
AS

   v_ref_cursor SYS_REFCURSOR;
   v_check NUMBER;

BEGIN

   select count(1) 
   into v_check
   from dummy_table dt 
   WHERE v_dummy_col3 = v_input


   -- condition that need to know the nr of records of the select
   IF v_check = 0 THEN
      v_OutID := 0;
   ELSE
      v_OutID := 1;

      OPEN v_ref_cursor FOR
      SELECT dt.v_dummy_col1,
             dt.v_dummy_col2
      FROM dummy_table dt
      WHERE v_dummy_col3 = v_input

      -- return dataset to .net application
      DBMS_SQL.RETURN_RESULT(v_ref_cursor)
   END IF;
END;
...