PL/SQL에 관한 질문이 있습니다. 0 4 2,064

by 머루원해 [PL/SQL] pl/sql oracle [2019.03.26 09:13:01]


20190325_191041.png (4,154Bytes)
20190325_191021.png (3,606Bytes)
3.png (10,452Bytes)

SQL developer (orgacle 11g) 사용합니다.
먼저, 테이블 정보는 아래에, 예시는 첨부하였습니다.

CREATE TABLE actor(
id INTEGER NOT NULL,
name VARCHAR2(100),
CONSTRAINT actor_PK PRIMARY KEY (id));


CREATE TABLE movie(
id INTEGER NOT NULL,
title VARCHAR2(100),
yr NUMBER(4,0),
score NUMBER,
votes INTEGER,
director VARCHAR2(100),
CONSTRAINT movie_PK PRIMARY KEY (id));


CREATE TABLE casting(
movie_id INTEGER NOT NULL,
actor_id INTEGER NOT NULL,
ord INTEGER,
CONSTRAINT casting_PK PRIMARY KEY (movie_id, actor_id),
CONSTRAINT casting_FK1 FOREIGN KEY (movie_id) REFERENCES movie(id),
CONSTRAINT casting_FK2 FOREIGN KEY (actor_id) REFERENCES actor(id));

PL/SQL 작성하는 건데 2000년과 2013년 사이에 최소한 한 가지 영화에 출연했던 배우를 먼저 발견하고,

2000년에서 2013년 사이에 이 배우가 각각의 연도마다 출연했던 총 영화 수를 계산합니다 (예를 들면, 홍길동이란 배우는 2001년에 1개, 2002년에 2개...).  매년마다, 'x 배우는 z년도에 Y개의 영화에 출연했다.' 를 보여줘야 합니다. 배우가 출연한 영화가 없는 연도는 0을 리턴해야 합니다.

예를 들어, 배우 "홍길동"을 고르면, 결과는 아래와 같아야 한다.

홍길동 배우는 2000년도에 1개의 영화에 출연했다.

홍길동 배우는 2001년도에 2개의 영화에 출연했다.

홍길동 배우는 2002년도에 0개의 영화에 출연했다.

...

홍길동 배우는 2013년도에 1개의 영화에 출연했다.

 

by 신이만든지기 [2019.03.26 09:59:55]

흠. 마치 대학교 과제처럼 보이네요...


by 마농 [2019.03.26 10:55:40]

http://gurubee.net/oracle/plsql   - Oracle PL/SQL 강좌 목록
http://gurubee.net/lecture/1056   - FOR LOOP
http://gurubee.net/lecture/1065   - FOR문에서 커서 사용(Cursor FOR Loops)
 

SET SERVEROUTPUT ON;

DECLARE
    CURSOR c1 IS
    SELECT DISTINCT a.id, a.name
      FROM movie m
     INNER JOIN casting c
        ON m.id = c.movie_id
     INNER JOIN actor a
        ON a.id = c.actor_id
     WHERE m.yr BETWEEN 2000 AND 2013
     ORDER BY name
    ;
    v_cnt NUMBER(3);
BEGIN
    FOR c2 IN c1
    LOOP
        FOR v_yr IN 2000..2013
        LOOP
            SELECT COUNT(*)
              INTO v_cnt
              FROM movie m
             INNER JOIN casting c
                ON m.id = c.movie_id
             WHERE m.yr = v_yr
               AND c.actor_id = c2.id
            ;
            DBMS_OUTPUT.PUT_LINE(c2.name || ' 배우는 ' || v_yr || '년도에 ' || v_cnt || '개의 영화에 출연했다.');
        END LOOP;
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('(' || SQLCODE || ')' || SQLERRM);
END;
/

 


by 머루원해 [2019.03.26 11:39:51]

error는 안나는데 결과값이 안나오네요 ㅠㅜ 첫 줄에 set serveroutput on이 run이 안되는 거같은데 원래 같이 run이 되야되는 건가요?


by 마농 [2019.03.26 13:26:55]

1. 출력 활성화 시키는 명령어로 우선 따로 실행하면 되구요. SET SERVEROUTPUT ON;
2. PL/SQL 구문 실행하면 스크립트 출력 텝으로 결과 나옵니다.
3. SQL 만 따로 실행해서 결과 확인해 보세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입