1. 현재까지 작성한 예약 프로시저

--seatcodes라는 배열 타입 생성 CREATE OR REPLACE TYPE SEATCODES AS TABLE OF VARCHAR(3); --예약 프로시저 CREATE OR REPLACE PROCEDURE ReserveProc (bookingcode in varchar2, email in varchar2, timecode in varchar2, screencode in varchar2, moviecode in varchar2, totalprice in integer, seatcount in integer, --seatcodes라는 타입을 만들었다. seatcodearr in seatcodes, email in varchar2, class in varchar2 ) IS I BINARY_INTEGER; BEGIN --멤버 마일리지 업데이트 UPDATE MEMBER SET MILEAGE = CASE WHEN class = 'D' THEN MILEAGE+totalprice*0.02 WHEN class = 'C' THEN MILEAGE+totalprice*0.04 WHEN class = 'B' THEN MILEAGE+totalprice*0.06 WHEN class = 'A' THEN MILEAGE+totalprice*0.08 WHEN class = 'S' THEN MILEAGE+totalprice*0.1 END; --BOOKING테이블 예약레코드 삽입 INSERT INTO BOOKING VALUES (bookingcode,email,timecode,screencode,moviecode,totalprice,seatcount); --seatcodearr을 루프 돌면서 BOOKED_SEATS에 삽입하고 PERFORMANCE_SEAT의 사용여부 업데이트. FOR I IN 1 .. seatcodearr.COUNT LOOP --BOOKED_SEATS에 INSERT INSERT INTO BOOKED_SEATS VALUES(bookingcode,seatcodearr(I)); --PERFORMANCE_SEAT UPDATE UPDATE PERFORMANCE_SEAT SET SEATSTATUS=1 WHERE SEATCODE= seatcodearr(I) and TIMECODE= timecode; END LOOP; --커밋. commit; END;


오류타입

  • 오류: PL/SQL: Compilation unit analysis terminated
  • 오류(1,1): PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted 



해결 ?


위와 같은오류는 아규먼트 선언부분에 중복변수가 있을 때 발생 

위의 코드를 보면 email이 중복이다. 

중복변수를 지워주면서 변수명도 바꿔주었다. 


CREATE OR REPLACE PROCEDURE RESERVEPROC
(p_bookingcode in varchar2,
 p_email in varchar2,
 p_timecode in varchar2,
 p_screencode in varchar2,
 p_moviecode in varchar2,
 p_totalprice in integer,
 p_seatcount in integer,
 p_seatcodes in seatcodes,
 p_class in varchar2
 )
 IS 
    I INTEGER;
 BEGIN
    --멤버 마일리지 업데이트
    UPDATE MEMBER
    SET MILEAGE = CASE 
                   WHEN class = 'D' THEN MILEAGE+p_totalprice*0.02
                   WHEN class = 'C' THEN MILEAGE+p_totalprice*0.04
                   WHEN class = 'B' THEN  MILEAGE+p_totalprice*0.06
                   WHEN class = 'A' THEN  MILEAGE+p_totalprice*0.08
                   WHEN class = 'S' THEN  MILEAGE+p_totalprice*0.1
                   END;
                   
    --BOOKING테이블 예약레코드 삽입               
    INSERT
    INTO BOOKING 
    VALUES (p_bookingcode,p_email,p_timecode,p_screencode,p_moviecode,p_totalprice,p_seatcount);               
     
    --seatcodearr을 루프 돌면서 BOOKED_SEATS에 삽입하고 PERFORMANCE_SEAT의 사용여부 업데이트.  
    FOR I IN 1 .. p_seatcodes.COUNT
    LOOP
        --BOOKED_SEATS에 INSERT
        INSERT
        INTO BOOKED_SEATS 
        VALUES(p_bookingcode,p_seatcodes(I));
         
        --PERFORMANCE_SEAT UPDATE
        UPDATE
        PERFORMANCE_SEAT 
        SET SEATSTATUS=1 
        WHERE SEATCODE= p_seatcodes(I)
        and TIMECODE= p_timecode;
    END LOOP;
    --커밋.
    commit;
END;



프로시저를 조회하니..


 select * from user_objects where object_type = 'PROCEDURE'; 

status가 valid하다고 나온다.성공!

블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요