proc에서 procedure 리턴값이 여러개인 경우문제...
글쓴이: shean0 / 작성시간: 수, 2003/02/12 - 1:06오후
안녕하세요..
지금 하려는 요지는 프로시져를 만들고 .. ( 이것에 like 를 사용하여..
여러개의 리턴값을 받아 올려구 )
이것을 프로씨 (ㅁㅁ.pc)에서 호출하려구 하는데요..
일단 proc에서 리턴값이(select 값이 1개 인것을 구현해 보았구요)...
그런데..리턴값이 여러개..인것을 어떻게 가져오는지 proc 에서 ... 알고
싶습니다..
아래는 제가 성공한 것과..현재 미완성 부분을 모두 발췌하였습니다.
:: sun-unix oracle8.0 입니다.
결론적으로 문제가 되는 부분은 리턴이 1개인것은 ==>성공
리턴이 여러개는 에러 입니다.
===============> full name으로 테스트 시의 결과===============>
CREATE OR REPLACE PROCEDURE search_text_roadname ( as_text IN varchar2 , as_roadid OUT number, as_roadseq OUT number, as_road_name OUT VARCHAR2, as_name_len OUT number ) IS s_msg VARCHAR2(50) := '성공' ; BEGIN BEGIN SELECT road_id,road_seq,road_name,lengthb(road_name) INTO as_roadid,as_roadseq,as_road_name,as_name_len FROM road_name_table WHERE road_name like as_text ; END; dbms_output.put_line('result:['||as_road_name||']ending'); END; /
==>
1 declare 2 as_text varchar2(30) :=''; 3 as_roadid number; 4 as_roadseq number; 5 as_roadname varchar2(30) :=''; 6 as_namelen number; 7 begin 8 as_text:='강변북로' ; 9
search_text_roadname(as_text,as_roadid,as_roadseq,as_roadname,as_namelen);
10 dbms_output.put_line('['||as_roadname||'=='||as_namelen||'ending');
11* end;
SQL> /
result:[강변북로]ending
[강변북로==8ending
PL/SQL procedure successfully completed.
===============<==== full name으로 테스트 시의 결과<==========
===============> like % ====================아직 미완성 ==>
Procedure created.
SQL>
SQL> declare 2 as_text varchar2(30) :=''; 3 as_roadid number; 4 as_roadseq number; 5 as_roadname varchar2(30) :=''; 6 as_namelen number; 7 begin 8 as_text:='강' ; //강변북 <==이것은 성공 9 search_text_roadname(as_text,as_roadid,as_roadseq,as_roadname,as_namelen); 10 dbms_output.put_line('['||as_roadname||'=='||as_namelen||'ending'); 11 end; 12 /
declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SEAN.SEARCH_TEXT_ROADNAME", line 10
ORA-06512: at line 9
<===========================================미완성
그래서.. for loop를 사용하려구 하거든요..
"afiedt.buf" 33 행, 1486 문자 1 CREATE OR REPLACE PROCEDURE search_text_roadname1 ( as_text IN varchar2 , 2 as_roadid OUT number, 3 as_roadseq OUT number, 4 as_road_name OUT VARCHAR2, 5 as_name_len OUT number 6 ) 7 IS 8 n_count number :=0; 9 s_msg VARCHAR2(50) := '성공' ; 10 tmp road_name_table%ROWTYPE; 11 BEGIN 12 dbms_output.put_line('조회 시작 '); 13 FOR cur_list1 IN( 14 SELECT road_id,road_seq,road_name,lengthb(road_name) 15 FROM road_name_table 16 WHERE road_name like as_text||'%' 17 )LOOP 18 n_count := n_count+1 ; 19 tmp.road_id := cur_list.road_id; 20 tmp.road_seq :=cur_list.road_seq; 21 tmp.road_name:=cur_list.road_name; 22 tmp.name_len :=cur_list.lengthb(road_name); 23 -- dbms_output.put_line('result:['||as_roadid||','||as_roadseq||','||as_road_name||','||as_name_len||']ending'); 24 dbms_output.put_line('result:['||tmp.road_id||','||tmp.road_seq||','||tmp.as_road_name||','||tmp.as_name_len||']e nding'); 25 END LOOP; 26 dbms_output.put_line('result:['||n_count||'건이다'); 27 EXCEPTION 28 WHEN OTHERS THEN 29 dbms_output.put_line('============my Error Checking======='); 30 dbms_output.put_line('ErrorCode=>'||SQLCODE); 31 dbms_output.put_line('contents==>'||SUBSTR(SQLERRM,1,100)); 32 END; 33 / 34 35 36 ------- ----------------------------------------------------------------- 37 19/9 PL/SQL: Statement ignored 38 19/26 PLS-00201: identifier 'CUR_LIST.AS_ROAD_ID' must be declared 39 20/9 PL/SQL: Statement ignored 40 20/25 PLS-00201: identifier 'CUR_LIST.ROAD_SEQ' must be declared 41 21/9 PL/SQL: Statement ignored 42 21/24 PLS-00201: identifier 'CUR_LIST.ROAD_NAME' must be declared 43 22/9 PL/SQL: Statement ignored 44 22/13 PLS-00302: component 'NAME_LEN' must be declared 45 24/9 PL/SQL: Statement ignored 46 24/83 PLS-00302: component 'AS_ROAD_NAME' must be declared/ ~
후... 일부로 에러 메세지 복사했구요..line표시두..
개념이 잘 안서네요... 예제를 구할 수 있는 곳이 있었으면....
그리고 조언두...부탁합니다.
Forums:
기억이 나는대로..
가물 가물 한데다가, 님의 코드를 자세히 보지 않았습니다만..
SQL에서 여러개의 select 결과를 가져오려면,
결과가 담길 변수를 array로 잡고, CURSOR를 썼었습니다.
참고가 되면 좋겠네요..
Re: 기억이 나는대로..
네 말씀 고맙습니다.
말씀하신데로
이런 코드가 있을때. 동작하는 코드입니다.
언제나 즐프를 꿈꾸며~
댓글 달기