错误 - PLS-00103:遇到符号 "SELECT"

Error - PLS-00103: Encountered the symbol "SELECT"

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

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语句分别是运行时,但是当我运行它在函数下面时错误显示。

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

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

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

现在,回答你的问题。

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

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

而且您不必担心 function 代码一旦创建就存储在元数据中。每当您调用该函数时,Oracle 都会使用元数据中的代码来执行其逻辑。

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

然后您可以在任何 if 工具 windows.

中仅执行 select 语句

干杯!!

也许您想要的是 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.

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