프로시져 에러가 나는데요 확인좀 부탁드립니다. ㅠㅠ 0 12 5,071

by dawnsori [PL/SQL] plsql procedure pl/sql [2019.01.28 11:47:54]


안녕하세요

아래 프로시져를 생성하려는데

자꾸 에러가 납니다. 

 

어떤 부분에서 에러가 나는건지 확인좀 부탁드립니다. 

감사합니다. ㅠㅠ

 

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; 
     /      
     

by 신이만든지기 [2019.01.28 12:06:59]

에러메시지를 써주세요.


by dawnsori [2019.01.28 12:11:38]

에러 메시지는 

ORA-24344: success with compilation error

이렇게 납니다. 


by 신이만든지기 [2019.01.28 12:21:40]
select * from user_errors;

또는 

show errors procedure 프로시저명;

이렇게 해서 에러코드 원인을 자세히 확인해보세요.


by dawnsori [2019.01.28 12:57:07]

감사합니다. 신이만든지기님

에러를 확인해봤지만 무슨말인지 잘 이해가 가지 않습니다. ㅠㅠ

 


by 마농 [2019.01.28 12:34:35]

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 구문이 뭔 의도인지?
  - 원래 의도와 틀리게 잘못 구현하신 듯.


by dawnsori [2019.01.28 12:56:17]

감사합니다. 마농님

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; 
     /   

 


by 마농 [2019.01.28 13:04:55]

1. 파라미터 선언부 오류
  - 오류 : varchar2(20)
  - 수정 : varchar2
  - 개선 : table_name.empno%type
2. if 문 오류
  - 오류 : else t_sum < 500 then
  - 수정 : elsif t_sum < 500 then
3. for 문 오류
  - loop ~ end loop 누락
4. 논리.
  - 아직도 if 문의 사용 의도가 뭔지?
  - 잘못 구현된 듯 함.


by dawnsori [2019.01.28 13:15:32]

1. 수정하였습니다. 

2. 수정하였습니다. 

3. 더 자세히 말씀드리자면 

A테이블에서 ID에 해당하는 여러 ROW들을 조회하여 

각 ROW의 title 이라는 컬럼을 모두 합쳐서 

B테이블의 1row에서 컬럼1~5까지에 나눠서 넣는것입니다. 

처음에는 A테이블의 title 컬럼을 합친뒤에 substrb로 나눠서 넣으려고 햇으나 

합치는 단계에서부터 길이가 너무 커서 에러가 났었습니다. 

그래서 plsql을 이용해서 각 title 컬럼의 lengthb 를 구한다음

b테이블의 컬럼 크기에 맞춰서 나눠 넣으려고 구현한것입니다. 

 

혹시 다른 더 좋은 방법이 있다면 알려주시면 감사하겠습니다.


by dawnsori [2019.01.28 13:17:32]

수정된 쿼리입니다. 

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; 
     /  


by dawnsori [2019.01.28 13:20:08]

해결되었습니다. 

다시한번 마농님 감사합니다. 


by 마농 [2019.01.28 13:25:10]

VARCHAR2(32767) 까지 선언 가능합니다.
title 를 나눌 때 기준 바이트가 100 인가요?
제목을 합쳐 나가다가 99 byte 다음에 제목이 오면
지금 사용하신 조건으로는 첫번째 컬럼이 100 바이트 를 넘기게 됩니다.
이때 제목을 중간에 잘라 넣을 것인지?
제목을 중간에 자르지 않고 다음 컬럼에 붙여 넣을 것인지?
이런 부분들을 고민하셔야 합니다.


by dawnsori [2019.01.28 13:31:25]

네 마농님

varchar2(32767) 보다 값이 커져서 문제가 생겼었습니다. 

나눌때 기준 바이트는 4000 바이트 이며 기준 바이트를 넘게되면 다음 컬럼에 넣으려고 합니다

말씀대로 알려주신 부분은 더 고민해보겠습니다.

 

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