在 Oracle SQL 的功能块中声明数字变量时出错
Posted
技术标签:
【中文标题】在 Oracle SQL 的功能块中声明数字变量时出错【英文标题】:Error when declaring a number variable in a function block in Oracle SQL 【发布时间】:2021-03-20 16:09:28 【问题描述】:SQL 工作表
create or replace FUNCTION checkSubmitted (pStudentId IN VARCHAR, pCourseCode IN VARCHAR, pAssignmentNumber IN NUMBER)
RETURN VARCHAR
IS output VARCHAR(20);
DECLARE mark_result NUMBER;
BEGIN
SELECT assignment.mark INTO mark_result FROM Assignment WHERE student_id = pStudentId AND course_code = pCourseCode AND assignment_number = pAssignmentNumber;
IF (mark_result IS NOT NULL) THEN
RETURN 'Submitted';
ELSE
RETURN 'Not Submitted';
END IF;
END;
编译器 - 日志
LINE/COL ERROR
--------- -------------------------------------------------------------
4/5 PLS-00103: Encountered the symbol "DECLARE" when expecting one of the following: begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior The symbol "begin" was substituted for "DECLARE" to continue.
12/4 PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: ( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
Errors: check compiler log
我想创建一个 SQL 检查函数,我需要在函数中声明一个变量。 请告知我该如何实现这一目标。
【问题讨论】:
很明显DECLARE
应该被删除。
只需删除DECLARE
,这是用于匿名块或子块的。 See the docs. 第二个错误似乎是因为你最后没有/
- 在最后的END;
之后,单独一行。
【参考方案1】:
如评论所述,您当前的问题很容易解决。
但是,我想向您指出另一个可能的“错误”——如果这些参数值的组合没有数据会发生什么? SELECT
不会返回 NULL
- 它会引发 NO_DATA_FOUND
异常,您应该处理它。 (我认为查询返回多个值的可能性不大;如果是,也处理它)。
另外,尽量避免使用多个RETURN
语句。程序可能很长,您可能会迷失在返回的位置和返回的内容上。设置输出变量的值(您声明但从未使用过),并在过程结束时返回它。
因此,考虑这样的事情:
create or replace function checksubmitted
(pstudentid in varchar, pcoursecode in varchar, passignmentnumber in number)
return varchar
is
mark_result number;
output varchar(100);
begin
select a.mark
into mark_result
from assignment a
where a.student_id = pstudentid
and a.course_code = pcoursecode
and a.assignment_number = passignmentnumber;
if mark_result is not null then
output := 'Submitted';
else
output := 'Not Submitted';
end if;
return output;
exception
when no_data_found then
output := 'There is no data for these input parameters';
return output;
end;
/
【讨论】:
以上是关于在 Oracle SQL 的功能块中声明数字变量时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 where 子句中使用 Oracle SQL 变量时遇到问题
在 DB2 PL/SQL 匿名块中声明局部变量和声明继续处理程序会导致错误?
在匿名块中使用变量来更改 SQL SEQUENCE 不起作用