test라는 테이블이 소유 컬럼은 소유이고 금전 컬럼은 null값일때
test테이블의의 pk값을 1건씩 읽어서
test2라는 테이블을 검색하는데
이때 test2의 col1컬럼이 한건이면 col5데이터를 읽고 1건이상이면 col2 컬럼이 정답인 col5 데이터만 읽으라는 과제를 받이서 작성해본 쿼리인데
create or replace procedure p_test is cursor c_1 is select * from test where col3= '소유' and col4 is null; r_1 c_1 %ROWTYPE; l_cnt test2%ROWTYPE; begin open c_1; loop fetch c_1 into r_1; exit when c_1%notfound; select count(*) into l_cnt from test2 where col1= r_1.col1; if l_cnt = 1 then DBMS_OUTPUT.put_line(test2 .col5); else select 주소 from test2 where col2 = '정답'; end if; end loop; close c_1; end p_test;
프로시저 SCOTT.p_test@scott
오류(11,1): PL/SQL: SQL Statement ignored
오류(11,29): PL/SQL: ORA-00913: 값의 수가 너무 많습니다
오류(12,1): PL/SQL: Statement ignored
오류(12,10): PLS-00306: '=' 호출 시 인수의 갯수나 유형이 잘못되었습니다
이런오류가 뜹니다.
수정하면 다른문제가 생기고 계속 반복만하다가 선배님들에게 어디가 잘못됬는지 조언을 구해봅니다ㅠㅠ
create or replace procedure p_test is cursor c_1 is select * from test where col3= '소유' and col4 is null; r_1 c_1 %ROWTYPE; r_2 VARCHAR(1000); l_cnt VARCHAR(1000); l_cnt_2 VARCHAR(1000); begin open c_1; loop fetch c_1 into r_1; exit when c_1%notfound; select col5 into r_2 from test_2; select col1 into l_cnt from test2 where col1 in(select col1 from test2 where group by col1 having count(*) =1); select col1 into l_cnt_2 from test2 where col1 in(select col1 from test2 where group by col1 having count(*) >1) and col2='정답'; if l_cnt = r_1.col1 then DBMS_OUTPUT.put_line(r_2); end if if if l_cnt_2 = r_1.col1 then DBMS_OUTPUT.put_line(r_2); end if; end loop; close c_1; end p_test;
정답인 건은 1건뿐이고 선배님 말씀대로 변수타입 수정, into절 및 변수추가 해보니 문제가 해결되었습니다 감사합니다.
CREATE OR REPLACE PROCEDURE p_test IS CURSOR c_1 IS SELECT * FROM test WHERE col3 = '소유' AND col4 IS NULL ; r_1 c_1%ROWTYPE; r_2 VARCHAR2(100); l_cnt NUMBER(3); BEGIN OPEN c_1; LOOP FETCH c_1 into r_1; EXIT WHEN c_1%NOTFOUND; SELECT COUNT(*) INTO l_cnt FROM test2 WHERE col1 = r_1.col1 ; r_2 := ''; IF l_cnt = 1 THEN SELECT col5 INTO r_2 FROM test2 WHERE col1 = r_1.col1 ; ELSIF l_cnt > 1 THEN SELECT col5 INTO r_2 FROM test2 WHERE col1 = r_1.col1 AND col2 = '정답' ; END IF; DBMS_OUTPUT.put_line(r_1.col1 || ' : ' || r_2); END LOOP; CLOSE c_1; END; /
제가 오타를 냈었네요...
CREATE OR REPLACE PROCEDURE p_test IS CURSOR c_1 IS SELECT * FROM test WHERE col3 = '소유' AND col4 IS NULL ; r_1 c_1%ROWTYPE; r_2 VARCHAR2(100); l_cnt NUMBER(3); BEGIN OPEN c_1; LOOP FETCH c_1 into r_1; EXIT WHEN c_1%NOTFOUND; SELECT COUNT(*) INTO l_cnt FROM test2 WHERE col1 = r_1.col1 ; r_2 := ''; IF l_cnt = 1 THEN SELECT col5 INTO r_2 FROM test2 WHERE col1 = r_1.col1 ; ELSIF l_cnt > 1 THEN SELECT col5 INTO r_2 FROM test2 WHERE col1 = r_1.col1 AND col2 = '정답' ; END IF; DBMS_OUTPUT.put_line(r_1.col1 || ' : ' || r_2); END LOOP; CLOSE c_1; END; / 위와같이 실행시 정상동작했습니다. 감사합니다!