안녕하세요
아래 프로시져를 생성하려는데
자꾸 에러가 납니다.
어떤 부분에서 에러가 나는건지 확인좀 부탁드립니다.
감사합니다. ㅠㅠ
CREATE OR REPLACE PROCEDURE test_1
(empno IN varchar2)
IS
t_sum number :=0 ;
t_val_1 varchar2(100);
t_val_2 varchar2(100);
t_val_3 varchar2(100);
t_val_4 varchar2(100);
t_val_5 varchar2(100);
cursor cr is
select title, lengthb(title) as t_len from table_name where empno=v_empno;
t_list cr%ROWTYPE;
BEGIN
for t_list in cr
LOOP
case when t_sum < 100 then
t_sum:=t_sum+t_list.t_len;
t_val_1 := t_val_1 || t_list.t_title;
when t_sum < 200 then
t_sum:=t_sum+t_list.t_len;
t_val_2 := t_val_2 || t_list.t_title;
when t_sum < 300 then
t_sum:=t_sum+t_list.t_len;
t_val_3 := t_val_3 || t_list.t_title;
when t_sum < 400 then
t_sum:=t_sum+t_list.t_len;
t_val_4 := t_val_4 || t_list.t_title;
when t_sum < 500 then
t_sum:=t_sum+t_list.t_len;
t_val_5 := t_val_5 || t_list.t_title;
end case;
END loop;
dbms_output.put_line(t_val_1 ||'--'|| t_val_2 ||'--'|| t_val_3 ||'--'|| t_val_4 ||'--'|| t_val_5);
end;
/
1. 다음 두가지 방식으로 에러메시지를 확인해 보세요.
- show errors
- SELECT * FROM user_errors;
2. 오류1 : 선언 오류(v_empno 선언 안됨)
- 오류 : ( empno IN varchar2)
- 수정 : (v_empno IN varchar2)
3. 오류2 : 구문 선택 오류
- 오류 : case ~
- 수정 : if ~
4. 불필요한 코드
- t_list cr%ROWTYPE;
- 이유 : for t_list in cr 에서 자동으로 선언되므로 불필요함
5. 논리적인 오류
- case when 구문이 뭔 의도인지?
- 원래 의도와 틀리게 잘못 구현하신 듯.
감사합니다. 마농님
1. select * from user_errors; 결과값은 아래와 같습니다.
PLS-00103: 심볼 "("를 만났습니다 다음 중 하나가 기대될 때: := . ) , @ %
default character
심볼이 ":=" 계속하기 위하여 "("로 치환되었습니다
PLS-00103: 심볼 "IF"를 만났습니다 다음 중 하나가 기대될 때: . ( * @ % &
- + / at loop mod remainder rem .. <지수(**)> || multiset
심볼이 "loop" 계속하기 위하여 "IF"로 치환되었습니다
PLS-00103: 심볼 "<"를 만났습니다 다음 중 하나가 기대될 때: := . ( @ % ;
2. 해당 오류는 제가 문의글을 작성하면서 회사에서 사용하는 컬럼명을 변경하다보니 v_empno로 한다는것을 잘못 기재하였습니다.
3. 수정하였습니다. (원래 if로 작성하였다가 이것저것 해보면서 case로 변경했던것입니다. )
4. 수정하였습니다.
5. 3번하고 같은 내용입니다. 원래 if~ elsif 로 했었다가 이것저것해보다가 변경된것입니다.
제가 하고싶었던 의도는 어떤 ID값을 가지고 데이터를 조회하면 여러 row가 나오는데
그중 각 row 중 varchar컬럼을 합쳐서 다른 테이블의 1개 row에 넣으려고 합니다.
근데 varchar 컬럼 합친값을 일정한 크기 단위로 잘라서 1 5개 컬럼에 넣으려고 하는것입니다.
수정된 쿼리 이며 여전히 에러가 나는데
어떤 부분을 수정해야할지 모르겠습니다. ㅠㅠ
한번더 조언 부탁드립니다. 감사합니다.
CREATE OR REPLACE PROCEDURE test_1
(v_empno IN varchar2(20))
IS
t_sum number :=0 ;
t_val_1 varchar2(500);
t_val_2 varchar2(500);
t_val_3 varchar2(500);
t_val_4 varchar2(500);
t_val_5 varchar2(500);
cursor cr is
select title, lengthb(title) as t_len from table_name where empno=v_empno;
BEGIN
for t_list in cr
if t_sum < 100 then
t_sum:=t_sum+t_list.t_len;
t_val_1 := t_val_1 || t_list.t_title;
elsif t_sum < 200 then
t_sum:=t_sum+t_list.t_len;
t_val_2 := t_val_2 || t_list.t_title;
elsif t_sum < 300 then
t_sum:=t_sum+t_list.t_len;
t_val_3 := t_val_3 || t_list.t_title;
elsif t_sum < 400 then
t_sum:=t_sum+t_list.t_len;
t_val_4 := t_val_4 || t_list.t_title;
else t_sum < 500 then
t_sum:=t_sum+t_list.t_len;
t_val_5 := t_val_5 || t_list.t_title;
end if;
dbms_output.put_line(t_val_1 ||'--'|| t_val_2 ||'--'|| t_val_3 ||'--'|| t_val_4 ||'--'|| t_val_5);
end;
/
1. 수정하였습니다.
2. 수정하였습니다.
3. 더 자세히 말씀드리자면
A테이블에서 ID에 해당하는 여러 ROW들을 조회하여
각 ROW의 title 이라는 컬럼을 모두 합쳐서
B테이블의 1row에서 컬럼1~5까지에 나눠서 넣는것입니다.
처음에는 A테이블의 title 컬럼을 합친뒤에 substrb로 나눠서 넣으려고 햇으나
합치는 단계에서부터 길이가 너무 커서 에러가 났었습니다.
그래서 plsql을 이용해서 각 title 컬럼의 lengthb 를 구한다음
b테이블의 컬럼 크기에 맞춰서 나눠 넣으려고 구현한것입니다.
혹시 다른 더 좋은 방법이 있다면 알려주시면 감사하겠습니다.
수정된 쿼리입니다.
for문 오류도 수정반영하였습니다.
CREATE OR REPLACE PROCEDURE test_1
(v_empno IN varchar2)
IS
t_sum number :=0 ;
t_val_1 varchar2(500);
t_val_2 varchar2(500);
t_val_3 varchar2(500);
t_val_4 varchar2(500);
t_val_5 varchar2(500);
cursor cr is
select title, lengthb(title) as t_len from table_name where empno=v_empno;
BEGIN
for t_list in cr
loop
IF t_sum < 100 then
t_sum:=t_sum+t_list.t_len;
t_val_1 := t_val_1 || t_list.t_title;
elsif t_sum < 200 then
t_sum:=t_sum+t_list.t_len;
t_val_2 := t_val_2 || t_list.t_title;
elsif t_sum < 300 then
t_sum:=t_sum+t_list.t_len;
t_val_3 := t_val_3 || t_list.t_title;
elsif t_sum < 400 then
t_sum:=t_sum+t_list.t_len;
t_val_4 := t_val_4 || t_list.t_title;
elsif t_sum < 500 then
t_sum:=t_sum+t_list.t_len;
t_val_5 := t_val_5 || t_list.t_title;
end if;
end loop;
dbms_output.put_line(t_val_1 ||'--'|| t_val_2 ||'--'|| t_val_3 ||'--'|| t_val_4 ||'--'|| t_val_5);
end;
/