Oracle PL/SQL 过程标识符必须声明错误

Oracle PL/SQL procedure identifier must be declared error

我对 SQL 和 PL/SQL 很陌生。我正在编写一个程序来获取博物馆的平均艺术品价格,然后将平均价格提高一个百分点。用户输入博物馆 ID (musmID) 和增加的百分比。如果百分比太高,则会引发异常。如果输入的 musmID 与 table 上的不匹配,则会引发异常。输出是博物馆名称、旧平均价格和新平均价格。到目前为止,它仅在未写入无效 musmID 异常时才有效。我不断收到 PLS-00201 的相同错误:必须声明标识符 'MUMSID'。

Table 1 是艺术,列名是 musmID(FK) 和价格。 Table 2 是博物馆,列名是博物馆和 musmID(PK)。

我的代码:

CREATE OR REPLACE PROCEDURE proc_second (p_musmID IN arts.musmID%TYPE,
p_percent IN NUMBER) IS

v_musmID arts.musmID%TYPE;
v_oldavg arts.price%TYPE;
v_newavg arts.price%TYPE;
v_musmName museums.museum%TYPE; 
too_high EXCEPTION;
musmID_invalid EXCEPTION;

BEGIN
IF p_percent > 40 THEN
  raise too_high;
END IF;
IF musmID != p_musmID THEN
  raise musmID_invalid;
END IF;

SELECT musmID, AVG(price) INTO v_musmID, v_oldavg from arts
WHERE musmID = p_musmID
GROUP BY musmID;

SELECT museum INTO v_musmName from museums
WHERE musmId = p_musmID;

v_newavg := v_oldavg * (1 + (p_percent/100));

dbms_output.put_line (v_musmname || ' ' || v_oldavg || ' ' || v_newavg);

EXCEPTION
WHEN too_high THEN
dbms_output.put_line ('Specify less than 40 percent increase');
WHEN musmID_invalid THEN
dbms_output.put_line ('You entered an invalid museum ID');

END;
/

Warning: Procedure created with compilation errors.

这些是我遇到的错误。

LINE/COL ERROR
-------- -----------------------------------------------------------------
15/3     PL/SQL: Statement ignored
15/6     PLS-00201: identifier 'MUSMID' must be declared

我知道这可能是我没有看到的基本内容,但到目前为止,如果我消除了错误,无论输入什么,程序都会引发 musmID_invalid 异常。

嗯。据我所知,这段代码排列错误。您首先检查一个变量,然后获取它的值。

我已经创建了两个虚拟表,只是为了让程序编译。

SQL> create table arts
  2    (musmid number,
  3     price  number);

Table created.

SQL> create table museums
  2    (musmid number,
  3     museum number);

Table created.

现在,程序:您似乎根本不需要 V_MUSMID 变量,因为它等于 P_MUSMID 参数(参见 SELECT 选择 AVG(PRICE) 及其 WHERE 子句)。这意味着您可以在整个代码中使用 P_MUSMID,而不是 V_MUSMID.

也意味着MUSMID_INVALID永远不会被提升;但是,你应该处理 NO_DATA_FOUND 如果你传递一个不存在的 P_MUSMID.

因此,我删除了我认为您不需要的部分,并且 - 这是剩余的代码;看看有没有用

SQL> create or replace procedure proc_second (p_musmid  in arts.musmid%type,
  2                                           p_percent in number)
  3  is
  4    v_oldavg       arts.price%type;
  5    v_newavg       arts.price%type;
  6    v_musmname     museums.museum%type;
  7    too_high       exception;
  8  begin
  9    if p_percent > 40 then
 10       raise too_high;
 11    end if;
 12
 13    select m.museum, avg(a.price)
 14      into v_musmname, v_oldavg
 15      from arts a join museums m on m.musmid = a.musmid
 16      where a.musmid = p_musmid
 17      group by m.museum;
 18
 19    v_newavg := v_oldavg * (1 + (p_percent/100));
 20
 21    dbms_output.put_line (v_musmname || ' ' || v_oldavg || ' ' || v_newavg);
 22
 23  exception
 24    when too_high then
 25      dbms_output.put_line ('Specify less than 40 percent increase');
 26    when no_data_found then
 27      dbms_output.put_line ('You entered an invalid museum ID');
 28  end;
 29  /

Procedure created.

SQL> exec proc_second(1, 20);
You entered an invalid museum ID

PL/SQL procedure successfully completed.

SQL>