错误 - 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”的主要内容,如果未能解决你的问题,请参考以下文章
错误(5,1):PLS-00103:创建函数时遇到符号“CREATE”错误
错误(11,1):PLS-00103:遇到符号“DECLARE”