Попытка создать функцию Generate_Series в Oracle db - PullRequest
1 голос
/ 06 ноября 2019
create
or replace Function Generate_Series (
  MinNumber INTEGER,
  MaxNumber INTEGER,
  NumberToSkip INTEGER
) Return Numbers_t 
As 
  newNumber INTEGER: = MinNumber;
  Numbers_t Numbers_x: = Numbers_t();
Begin 
  for x in (
  with s as (
    Select
      rNo
    From
      (
        select
          level rno
        from
          dual connect by level <= enNumber
      ) A
    Where
      A.rNo >= stNumber
  )
  select
    rno
  from
    s
) loop 
if x.rno <> MinNumber then 
  newNumber: = newNumber + NumberToSkip;
end if;
if newNumber >= MaxNumber then 
  Return;
end if;
  Numbers_x.EXTEND; 
  Numbers_x(Numbers_x.COUNT): = newNumber;
  end loop;
  Return Numbers_x;
End;

Видя эту ошибку

"Function GENERATE_SERIES compiled

LINE/COL  ERROR
--------- -------------------------------------------------------------
0/0       PL/SQL: Compilation unit analysis terminated
13/8      PLS-00320: the declaration of the type of this expression is incomplete or malformed
Errors: check compiler log"

Может ли кто-нибудь помочь мне с этим TIA.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Вы слишком усложняете вещи. Вам не нужно SELECT, FROM DUAL или что-то подобное.
Достаточно простого цикла FOR.

Если предположить, что numbers_t определен как:

CREATE OR REPLACE TYPE numbers_t AS TABLE OF NUMBER;

Тогда вы можете использовать это:

CREATE FUNCTION generate_series (minnumber INTEGER, maxnumber INTEGER)
   RETURN numbers_t
   PIPELINED
   DETERMINISTIC
IS
BEGIN
   FOR i IN minnumber .. maxnumber LOOP
      PIPE ROW (i);
   END LOOP;
   RETURN;
END;
/

Для использования функции, вам нужно:

SELECT * 
FROM TABLE(generate_series(1,42))
0 голосов
/ 06 ноября 2019

Не шутить над вашей стороной, но:

  1. Вызов пользовательских функций из SQL в Oracle, как правило, плохая вещь, не вызывающая никаких проблем.
  2. Если вам нужно сгенерировать последовательность чисел в Oracle, обычный способ сделать это с помощью простого SELECT...FROM DUAL запроса, например:

    SELECT LEVEL-1 FROM DUAL CONNECT BY LEVEL-1 < 24

Это генерирует список чисел от 0 до 23 - корректировать по мере необходимости.

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