저는 SQL과 PL / SQL을 처음 접했습니다. 나는 박물관을 가져 가서 미술품 가격을 평균 한 다음 평균을 퍼센트 올리는 절차를 작성하고 있습니다. 사용자는 박물관 ID (musmID) 및 증가율을 입력합니다. 백분율이 너무 높으면 예외가 발생합니다. 입력 한 musmID가 테이블에있는 것과 일치하지 않으면 예외가 발생합니다. 출력은 박물관 이름, 이전 평균 가격 및 새 평균 가격입니다. 지금까지는 유효하지 않은 musmID에 대한 예외가 작성되지 않은 경우에만 작동합니다. PLS-00201 : identifier '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 예외가 발생합니다.
허. 이 코드는 내가 알 수있는 한 잘못 배열되어 있습니다. 먼저 변수를 확인한 다음 그 값을 가져옵니다.
프로 시저를 컴파일하기 위해 두 개의 더미 테이블을 만들었습니다.
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>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다