Oracle PL-SQL 函数出现错误 PLS-00103:在预期以下情况之一时遇到符号“SELECT”
Posted
技术标签:
【中文标题】Oracle PL-SQL 函数出现错误 PLS-00103:在预期以下情况之一时遇到符号“SELECT”【英文标题】:Oracle PL-SQL function getting error PLS-00103: Encountered the symbol "SELECT" when expecting one of the following 【发布时间】:2020-09-14 17:04:03 【问题描述】:create or replace function noMembers(projNum integer) return integer IS
memCount integer;
Begin
memCount := ( select count(*)
from TABLE( select p.members from Projects p where p.projNo = projNum));
return memCount;
End;
End;
当我尝试在 Oracle - SQL*Plus 中创建上述函数时,出现错误;
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/10 PLS-00103: Encountered the symbol "SELECT" when expecting one of
the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted string literal with character set
specification>
<an alternat
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/69 PLS-00103: Encountered the symbol ")" when expecting one of the
following:
, ; for <an identifier>
<a double-quoted delimited-identifier> as group having
intersect minus order start union where connect
似乎找不到函数声明有什么问题,我想从函数返回分配给每个项目的成员数(成员计数)。
select count(*) from TABLE( select p.members from Projects p where p.projNo = 10 )
单独执行上述查询时效果很好。我还需要在函数中声明的“memCount
”变量。
感谢任何帮助...
【问题讨论】:
select count(*) into memcount from ...
【参考方案1】:
您不能分配这样的查询结果;语法是:
select count(*)
into memCount
from ...
db<>fiddle
语法is in the documentation
但是是否有可能分配给 memCount 变量(我的意思是使用 ':=' 运算符)?
Not directly from a query。您可以将整个集合查询到一个局部变量中,然后您可以分配它的计数:
create or replace function noMembers(projNum integer) return integer IS
memCount integer;
memColl projects.members%type;
Begin
select p.members
into memColl
from Projects p where p.projNo = projNum;
memCount := memColl.count;
return memCount;
End;
/
或者没有赋值:
create or replace function noMembers(projNum integer) return integer IS
memColl projects.members%type;
Begin
select p.members
into memColl
from Projects p where p.projNo = projNum;
return memColl.count;
End;
/
db<>fiddle
但除非您打算对集合做任何其他事情,否则这可能只是浪费精力和内存。
【讨论】:
谢谢您的回答...!它工作得很好。但是是否有可能分配给 memCount 变量(我的意思是使用 ' := ' 运算符)? 你为什么执着于使用赋值运算符。 "SELECT .. INTO' 的构造是如何使用 PL/SQL 将查询结果分配给变量。以上是关于Oracle PL-SQL 函数出现错误 PLS-00103:在预期以下情况之一时遇到符号“SELECT”的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00306:调用 oracle 函数时参数的数量或类型错误
在 Oracle 中创建函数时出现 PLS-00103 错误