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”的主要内容,如果未能解决你的问题,请参考以下文章

oracle函数错误pls-00103

PLS-00306:调用 oracle 函数时参数的数量或类型错误

在 Oracle 中创建函数时出现 PLS-00103 错误

Oracle 存储过程不工作 PLS-00306

PLS-00103:在 oracle 函数中预期以下之一时遇到符号“IF”

oracle程序错误PLS-00103遇到符号“END”[关闭]