首页 > 解决方案 > 使用 NUMTODSINTERVAL 的 Oracle 过程

问题描述

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

抱歉乱码,但stackoverflow抱怨我必须添加更多文本

Xxxxxxxxxxxx Yyyyyyyyggggggg 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;
/

标签: oracleintervalsprocedure

解决方案


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

如果我们按照发布的方式运行您的代码,我们将收到编译错误

错误:PROCEDURE CREATE_XXX Line/Col:26/1 PLS-00103:在预期以下情况之一时遇到符号“END”:

. ( * % & = - + ; < / > at in is mod 余数 not rem <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset 符号“;”被替换为“END”以继续。

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

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

那会给我们留下编译错误

错误:PROCEDURE CREATE_XXX Line/Col:0/0 PL/SQL:编译单元分析终止 Line/Col:1/1 PLS-00410:RECORD、TABLE 或参数列表中不允许重复字段

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

 AS 
   l_schedule_id PLS_INTEGER;
   l_base_date DATE;
   l_offset  PLS_INTEGER;

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

错误:PROCEDURE CREATE_XXX Line/Col:21/2 PL/SQL:语句被忽略 Line/Col:22/1 PLS-00382:表达式类型错误

第 22 行是numtodsinterval调用。这个错误是因为numtodsinterval返回一个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_id或声明l_base_date为局部变量。您可以只使用传入的参数。
  • 如果要声明这些变量,只需使用赋值运算符:=将输入参数中的值分配给局部变量,而不是使用select ... from dual.

推荐阅读