使用 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_id
或 l_base_date
声明为局部变量。你可以只使用传入的参数。
- 如果您要声明这些变量,只需使用赋值运算符
:=
将输入参数中的值赋给局部变量,而不是执行 select ... from dual
.
是否可以在过程中使用 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_id
或l_base_date
声明为局部变量。你可以只使用传入的参数。 - 如果您要声明这些变量,只需使用赋值运算符
:=
将输入参数中的值赋给局部变量,而不是执行select ... from dual
.