使用 NUMTODSINTERVAL 的 Oracle 过程

Oracle procedure using NUMTODSINTERVAL

是否可以在过程中使用 NUMTODSINTERVAL。如果是这样,为什么这段代码不起作用?

抱歉出现乱码,但 Whosebug 抱怨我不得不添加更多文本

Xxxxxxxxxxx Yyyyyyyygggggg Xxxxxxxxx



CREATE OR REPLACE PROCEDURE CREATE_XXX
 (
  i_schedule_id IN PLS_INTEGER,
i_base_date IN DATE,
  i_offset IN PLS_INTEGER DEFAULT 0, 
i_incr IN PLS_INTEGER DEFAULT 10,
  i_duration         IN PLS_INTEGER DEFAULT 5
  )
 AS 
 l_schedule_id PLS_INTEGER;
l_base_date DATE;
I_offset  PLS_INTEGER;

 BEGIN 

    SELECT i_schedule_id              
INTO  l_schedule_id FROM DUAL; 

     SELECT          i_base_date 
INTO  l_base_date  FROM DUAL; 

 l_offset :=
NUMTODSINTERVAL(i_offset, 'SECOND') 


END;
/

如果不对不起作用的部分进行一些描述,“为什么这段代码不起作用”并不是特别有用。在这种情况下,我假设我们只是在讨论您代码中的语法错误。

如果我们 运行 您发布的代码,我们将得到编译错误

Errors: PROCEDURE CREATE_XXX Line/Col: 26/1 PLS-00103: Encountered the symbol "END" when expecting one of the following:

. ( * % & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol ";" was substituted for "END" to continue.

那是因为第 26 行,numtodsinterval 调用在末尾缺少分号

 l_offset :=
NUMTODSINTERVAL(i_offset, 'SECOND') ;

这会给我们留下编译错误

Errors: PROCEDURE CREATE_XXX Line/Col: 0/0 PL/SQL: Compilation unit analysis terminated Line/Col: 1/1 PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted

那是因为 i_offset 被声明为过程的参数和局部变量。我假设您的意图是对局部变量使用 l_ 前缀。

 AS 
   l_schedule_id PLS_INTEGER;
   l_base_date DATE;
   l_offset  PLS_INTEGER;

解决这个问题,现在语法错误是

Errors: PROCEDURE CREATE_XXX Line/Col: 21/2 PL/SQL: Statement ignored Line/Col: 22/1 PLS-00382: expression is of wrong type

第 22 行是 numtodsinterval 调用。这个错误是因为 numtodsinterval returns 一个 interval day to second 但你试图将它分配给类型 pls_integer 的局部变量。我们需要更改数据类型

 AS 
   l_schedule_id PLS_INTEGER;
   l_base_date DATE;
   l_offset  interval day to second;
 BEGIN 

这导致代码编译成功。此时代码仍然存在问题,但可以编译。

  • 似乎没有任何理由将 l_schedule_idl_base_date 声明为局部变量。你可以只使用传入的参数。
  • 如果您要声明这些变量,只需使用赋值运算符 := 将输入参数中的值赋给局部变量,而不是执行 select ... from dual.