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: 기억이 나는대로..
네 말씀 고맙습니다.
말씀하신데로
CREATE or Replace PROCEDURE FIND_EMPNO ( as_emp IN VARCHAR2 ) IS n_count NUMBER(03) := 0 ; t_person PERSONNEL%ROWTYPE ; BEGIN dbms_output.put_line('조회결과 : [' || as_emp || ']로 조회시..'); dbms_output.put_line('-------------------------------------------'); FOR cur_list IN ( SELECT EMPNO, EMP_NAME,EMP_SUB FROM PERSONNEL WHERE EMPNO LIKE '%' || as_emp || '%' OR EMP_NAME LIKE '%' || as_emp || '%' ORDER BY EMPNO ) LOOP t_person.empno := cur_list.empno ; t_person.emp_name := cur_list.emp_name ; t_person.emp_name := cur_list.emp_sub ; n_count := n_count + 1 ; /*여기를 수정*/ dbms_output.put_line('사번 : ' || t_person.empno || ' 성명 : ' || t_person.emp_name); END LOOP; dbms_output.put_line('-------------------------------------------'); dbms_output.put_line(TO_CHAR(n_count) || ' 건의 사번을 찾았습니다.'); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('<<< ERROR >>>>>>>>>>>>'); dbms_output.put_line('에러코드 : ' || SQLCODE); dbms_output.put_line('에러내용 : ' || SUBSTR(SQLERRM, 1, 100)); END; /이런 코드가 있을때. 동작하는 코드입니다.
언제나 즐프를 꿈꾸며~
댓글 달기