Использование refcursor в качестве входных данных для функции в oracle, получение ошибки - не удается получить доступ к строкам из не вложенного элемента таблицы при выполнении - PullRequest
0 голосов
/ 14 октября 2019

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

Функциякод -

CREATE OR REPLACE FUNCTION KAG9802.GET_INJUREDPARTYTYPE
(name_in IN SYS_REFCURSOR)

   RETURN SYS_REFCURSOR
IS 
 my_cursor SYS_REFCURSOR;
var1 varchar2(50);


BEGIN



LOOP
FETCH name_in INTO var1;

IF var1 = 'Near Miss' THEN

OPEN my_cursor
             for SELECT 1 from dual;
ELSE

 OPEN my_cursor
            for select 2 from dual;

   END IF ;
EXIT WHEN name_in%NOTFOUND;



end loop;

RETURN my_cursor;
close name_in;
END;

При выполнении функции следующим образом:

select * FROM TABLE ( GET_INJUREDPARTYTYPE(
CURSOR
 (
    select 'abcd'  from dual
    union
    select 'efgh'  from dual) 
) );

Я получаю сообщение об ошибке

ORA-22905: не удается получить доступ к строкам изэлемент не вложенной таблицы

Также я не уверен, является ли это хорошим подходом для проверки входных значений из выпадающего списка. Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Вместо возврата CURSOR вы можете вернуть PIPELINED коллекцию:

CREATE OR REPLACE FUNCTION GET_INJUREDPARTYTYPE(
  name_in IN SYS_REFCURSOR
) RETURN SYS.ODCINUMBERLIST PIPELINED
IS 
  my_cursor SYS_REFCURSOR;
  name      VARCHAR2(50);
  int_value INTEGER;
BEGIN
  LOOP
    FETCH name_in INTO name;
    EXIT WHEN name_in%NOTFOUND;

    IF name = 'Near Miss' THEN
      OPEN my_cursor FOR SELECT 1 FROM dual;
    ELSE
      OPEN my_cursor FOR SELECT 2 FROM dual;
    END IF ;
    LOOP
      FETCH my_cursor INTO int_value;
      EXIT WHEN my_cursor%NOTFOUND;
      PIPE ROW ( int_value );
    END LOOP;
    CLOSE my_cursor;
  END LOOP;
  CLOSE name_in;
END;
/

Тогда:

SELECT *
FROM   TABLE(
         get_injuredPartyType(
           CURSOR(
             SELECT 'abc'       FROM DUAL UNION ALL
             SELECT 'Near Miss' FROM DUAL
           )
         )
       );

Будет выводить:

| COLUMN_VALUE |
| -----------: |
|            2 |
|            1 |

дБ <> скрипка здесь

0 голосов
/ 14 октября 2019

Ваша функция верна, но вы вызываете ее с неправильным синтаксисом.

Вам необходимо создать курсор и передать его функции, а также присвоить возвращаемое значение другой функции.

Что-то вроде следующего:

SQL> SET SERVEROUT ON
SQL>
SQL> DECLARE
  2      MY_CUR    SYS_REFCURSOR;
  3      MY_CUR1   SYS_REFCURSOR;
  4  BEGIN
  5      OPEN MY_CUR FOR SELECT
  6                          'abcd'
  7                      FROM
  8                          DUAL
  9                      UNION
 10                      SELECT
 11                          'efgh'
 12                      FROM
 13                          DUAL;
 14
 15      MY_CUR1 := GET_INJUREDPARTYTYPE(MY_CUR);
 16      DBMS_SQL.RETURN_RESULT(MY_CUR1);
 17  END;
 18  /

PL/SQL procedure successfully completed.

ResultSet #1

         2
----------
         2

SQL>

Ура !!

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