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

时间:2019-10-19 22:27:13

标签: sql oracle oracle11g stored-functions

我正在尝试在单个代码块中创建和使用一个函数。该函数工作正常,但是当我尝试使用下面的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语句单独运行时的消息,但是当我在函数下面运行它时会显示错误。

2 个答案:

答案 0 :(得分:1)

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

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

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

现在,回答您的问题。

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

在您的情况下,发生的情况是您的tool无法识别function代码的结尾。

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

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

如果有工具窗口,则只能执行select语句。

干杯!

答案 1 :(得分:0)

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

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