错误 - PLS-00103:遇到符号“SELECT”

Posted

技术标签:

【中文标题】错误 - PLS-00103:遇到符号“SELECT”【英文标题】:Error - PLS-00103: Encountered the symbol "SELECT" 【发布时间】:2019-10-19 22:27:13 【问题描述】:

我正在尝试在单个代码块中创建和使用一个函数。该函数工作正常,但是当我尝试在它下面使用 select 语句时,oracle 给了我一个错误。当我在单独的块中运行 select 语句时,它会返回我想要的。

CREATE OR REPLACE FUNCTION TOT_PURCH_SF 
    (p_shopper_ID IN number)
    RETURN NUMBER 
    AS 
    lv_sum NUMBER;
BEGIN
  SELECT SUM(TOTAL)
    into lv_sum
    from bb_basket;
  RETURN lv_sum;
END;


SELECT TOT_PURCH_SF(23) tot_purch
    FROM BB_SHOPPER
    WHERE idshopper = 23;

我希望输出是546.86,是单独运行select语句的时候,但是当我在函数下面运行时显示错误。

【问题讨论】:

函数内没有使用参数p_shopper_ID 顺便说一句,您的函数不使用传入的购物者 ID 我无法在this db fiddle 中重现您的错误。它在 Oracle 11g 和 18c 上都能正常工作。 您在函数代码末尾和 SELECT 语句之前的一行中缺少斜杠。 【参考方案1】:

我认为您使用的是sql-developer 或其他类型的tool

首先在function代码后面直接使用SELECT语句有什么要求?

Functions 是存储代码,您可以从任何地方调用它们。

现在,回答你的问题。

    只需选择(光标左键单击并拖动)最后 3 行(即select 语句)并执行它们。它将单独工作。 在function 的代码结束后使用slash (/) 使其成为pl/sql 代码的终点。

在您的情况下,您的tool 无法识别function 代码的结束位置。

而且您不必担心 function 代码在创建后存储在元数据中等问题。并且无论何时调用该函数,Oracle 都会使用元数据中的代码来执行其逻辑。

我建议完全隔离function 的创建和使用。即从一个窗口创建函数并在成功创建后关闭该窗口。

然后您可以在任何工具窗口中只执行select 语句。

干杯!!

【讨论】:

【参考方案2】:

也许您想要的是inline function in a WITH clause,而不是单独声明的。

设置:

create table bb_shopper
( idshopper integer primary key );

create table bb_basket
( idshopper references bb_shopper
, total     number );

insert all
    into bb_shopper values (23)
    into bb_basket values (23, 1)
    into bb_basket values (23, 2)
    into bb_basket values (23, 3)
select null from dual;

演示:

with function tot_purch_sf 
        ( p_shopper_id in bb_shopper.idshopper%type )
        return number 
    as 
        lv_sum number;
    begin
        select sum(total) into lv_sum
        from   bb_basket
        where  idshopper = p_shopper_id;

        return lv_sum;
    end;
select tot_purch_sf(23) tot_purch
from   bb_shopper
where  idshopper = 23
/

 TOT_PURCH
----------
         6

1 row selected.

如果这是您想要的,那么值得更新您的问题标题,以便其他人更容易找到它。

【讨论】:

以上是关于错误 - PLS-00103:遇到符号“SELECT”的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00103 遇到符号“数字”

PLS-00103:预期时遇到符号“(”

错误(5,1):PLS-00103:创建函数时遇到符号“CREATE”错误

错误(11,1):PLS-00103:遇到符号“DECLARE”

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

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