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>
我对 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>