oracle - 使用 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;
/
解决方案
如果没有对什么不起作用的描述,“为什么这段代码不起作用”并不是特别有用。在这种情况下,我假设我们只是在讨论代码中的语法错误。
如果我们按照发布的方式运行您的代码,我们将收到编译错误
错误: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
.
推荐阅读
- node.js - ExpressJS Handlebars 在文件更改时更新部分
- google-api - Ruby on rails:Google API dailyLimitExceededUnreg
- android - 如何在 Android N 中从 URI 获取文件路径
- keras - 自定义损失函数会影响 Keras 中的反向传播吗?
- google-cloud-platform - 如何通过 API 从 Deployment Manager 获取查询配额?
- pandas - 嵌套字典到熊猫 df
- javascript - 在某些情况下无法重置属性,vue.js
- javascript - 无法使用 angular5 在输入中显示文件上传详细信息
- java - Java - 比较 Sentinel 值的字符串的问题
- python-3.x - Selenium 的 Send_Keys 未捕获 pyqt5 的 QLabel 文本