Хранимая процедура Oracle возвращает набор результатов

Могу ли я определить хранимую процедуру без использования RefCursor? (например, "вернуть рефкурсор")

Я не хочу использовать OracleDbType.RefCursor, потому что он не отправляется как параметр db в другие базы данных.

Также DbParameter.DbType = OracleDbType.RefCursor; не поддерживается

Я не хочу определять «retval IN OUT SYS_REFCURSOR» в приведенном ниже коде. Есть ли другой способ?

CREATE OR REPLACE procedure SYSTEM.customer_select_row(
    p_email IN CUSTOMER.Email%TYPE,
    p_password IN CUSTOMER."Password"%TYPE,
    retval IN OUT SYS_REFCURSOR
  )
IS
BEGIN
  OPEN retval FOR
    SELECT CustomerId, FirstName, LastName FROM CUSTOMER
    WHERE Email = p_email AND "Password" = p_password 

END customer_select_row;

person Korkut Düzay    schedule 03.10.2017    source источник


Ответы (1)


Вы можете использовать функцию конвейера,

Это функция, которая работает точно так же, как таблица

вы можете назвать это так

SELECT * 
  FROM TABLE(TEST_PIPELINE.STOCKPIVOT(10));

TEST_PIPELINE.STOCKPIVOT(10) — это функция

вы можете построить его следующим образом:

create or replace PACKAGE TEST_PIPELINE AS

  -- here you declare a type record 
  type t_record is record
  (
    field_1     VARCHAR2(100),
    field_2      VARCHAR2(100));

  -- declare a table type from your previously created type 
  TYPE t_collection IS TABLE OF t_record;

  -- declare that the function will return the collection pipelined
  FUNCTION StockPivot(P_LINES NUMBER) RETURN t_collection PIPELINED;

  END;

/

create or replace PACKAGE BODY TEST_PIPELINE IS

FUNCTION StockPivot(P_LINES NUMBER) RETURN t_collection PIPELINED IS

  -- declare here a type of the record
  T_LINE T_RECORD;

  BEGIN

    -- here is a loop example for insert some lines on pipeline
    FOR I IN 1..P_LINES LOOP

      -- inser data on your line this way
      T_LINE.field_1      := 'LINE - ' || I;
      T_LINE.field_2      := 'LINE - ' || I;

      -- then insert insert the line for result (this kind of functions should not have a return statement)
      PIPE ROW (T_LINE );

    END LOOP;

  END;

END;
person Lucas Gomes de Oliveira    schedule 03.10.2017