尝试在Oracle数据库中创建Generate_Series函数

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。

twinsen_zx 回答:尝试在Oracle数据库中创建Generate_Series函数

您使事情变得过于复杂。您不需要SELECT或FROM DUAL或类似的东西。
一个普通的FOR循环就足够了。

假设数字_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))
,

不是要打扰您的聚会,而是:

  1. 在Oracle中从SQL调用用户定义的函数通常是一件坏事,不会引起任何问题。
  2. 如果您需要在Oracle中生成一系列数字,通常的方法是使用简单的SELECT...FROM DUAL查询,如下所示:

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

这会生成一个从0到23的数字列表-根据需要进行调整。

本文链接:https://www.f2er.com/3150695.html

大家都在问