我是SQL和PL / SQL的新手。我正在写一个采取博物馆的程序,平均艺术品的价格,然后将平均值提高一个百分点。用户输入博物馆ID(musmID)和百分比增加。如果百分比太高,则会引发异常。如果输入的musmID与表中的musmID不匹配,则会引发异常。输出是博物馆名称,旧平均价格和新的平均价格。到目前为止,它仅在未写入无效musmID的异常时才起作用。我一直得到与PLS-00201相同的错误:标识符' MUMSID'必须宣布。
表1是艺术和专栏名称是musmID(FK)和价格。 表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异常。
答案 0 :(得分:0)
咦。据我所知,这段代码的排列错误。您首先检查变量,然后获取其值。
我创建了两个虚拟表,只是为了使程序编译。
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
参数(请参阅选择{{1}的SELECT
和它的AVG(PRICE)
子句。这意味着您可以在整个代码中使用WHERE
,而不是P_MUSMID
。
这也意味着永远不会提出V_MUSMID
;但是,如果你传递一个不存在的MUSMID_INVALID
,你应该处理NO_DATA_FOUND
。
所以,我删除了我认为你不需要的内容 - 这是剩下的代码;看看它是否有用。
P_MUSMID