【问题标题】:Oracle procedure using NUMTODSINTERVAL使用 NUMTODSINTERVAL 的 Oracle 过程
【发布时间】:2021-08-20 18:56:29
【问题描述】:

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

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

Xxxxxxxxxxx 呸呸呸呸呸 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;
/

【问题讨论】:

    标签: oracle intervals procedure


    【解决方案1】:

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

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

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

    。 ( * % & = - + ; at in 是 mod 余数不是 rem or != or ~= >= and or like like2 like4 喜欢在 || 之间multiset 成员 submultiset 符号“;”曾是 替换为“END”以继续。

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

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

    这会给我们留下编译错误

    错误:PROCEDURE CREATE_XXX Line/Col:0/0 PL/SQL:编译单元 分析终止行/列: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:语句被忽略 行/列: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_idl_base_date 声明为局部变量。您可以只使用传入的参数。
    • 如果您要声明这些变量,只需使用赋值运算符:= 将输入参数中的值分配给局部变量,而不是使用select ... from dual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2020-05-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多