我正在尝试在单个代码块中创建和使用一个函数。该函数工作正常,但是当我尝试使用下面的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语句单独运行时的消息,但是当我在函数下面运行它时会显示错误。
答案 0 :(得分:1)
我认为您正在使用sql-developer
或其他类型的tool
。
首先在SELECT
代码之后直接使用function
语句有什么要求?
Functions
是存储的代码,您可以从任何地方调用它们。
现在,回答您的问题。
select
语句)并执行它们。它将单独工作。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.
如果这是您想要的,那么值得更新您的问题标题,以使其他人更容易找到它。