PLS-00103:遇到符号“DECLARE”

RD7*_*RD7 4 oracle plsql

我正在尝试执行或运行以下 pl/sql 脚本:

SET serveroutput on;

CREATE OR REPLACE PROCEDURE findAvg
(p_category IN products.category_id% TYPE, c OUT NUMBER)
AS
BEGIN
SELECT NVL ((SELECT AVG(LIST_PRICE) FROM products
WHERE p_category = category_id), -1) into p_category
from dual;
END findAvg;
DECLARE
 cat  products.category_id%TYPE;
 Price   products.List_price%TYPE;
BEGIN
cat := &p_category;
findAvg (cat, price); 
if (price = -1) then
    dbms_output.put_line('Wrong Category ');
ELSE
    dbms_output.put_line('the average price for category' || cat || ' is ' || price);
 END IF;
END;
/
show errors
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行它时,我收到此错误消息(我只能在显示错误后才能看到它):

       PLS-00103: Encountered the symbol "DECLARE" 
Run Code Online (Sandbox Code Playgroud)

这个声明有什么问题吗?

Ton*_*ews 10

您在过程的创建和运行它的匿名块的开头之间缺少一个“/”:

SET serveroutput on;

CREATE OR REPLACE PROCEDURE findAvg
(p_category IN products.category_id% TYPE, c OUT NUMBER)
AS
BEGIN
  SELECT NVL(AVG(LIST_PRICE),-1)
  INTO c
  FROM products
  WHERE p_category = category_id;
END findAvg;
/

show errors

DECLARE
 cat  products.category_id%TYPE;
 Price   products.List_price%TYPE;
BEGIN
cat := &p_category;
findAvg (cat, price); 
if (price = -1) then
    dbms_output.put_line('Wrong Category ');
ELSE
    dbms_output.put_line('the average price for category' || cat || ' is ' || price);
 END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

此外,“显示错误”命令应在创建过程后立即运行,如我上面所述,并且 INTO 子句应指定 OUT 参数。