proc에서 procedure 리턴값이 여러개인 경우문제...

shean0의 이미지

안녕하세요..
지금 하려는 요지는 프로시져를 만들고 .. ( 이것에 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표시두..
개념이 잘 안서네요... 예제를 구할 수 있는 곳이 있었으면....
그리고 조언두...부탁합니다.
june8th의 이미지

가물 가물 한데다가, 님의 코드를 자세히 보지 않았습니다만..
SQL에서 여러개의 select 결과를 가져오려면,
결과가 담길 변수를 array로 잡고, CURSOR를 썼었습니다.
참고가 되면 좋겠네요..

shean0의 이미지

네 말씀 고맙습니다.
말씀하신데로

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

이런 코드가 있을때. 동작하는 코드입니다.

Quote:
처음의 정의부분
CREATE or Replace PROCEDURE FIND_EMPNO ( as_emp IN VARCHAR2 )
==>
CREATE or Replace PROCEDURE FIND_EMPNO ( 
      as_emp IN VARCHAR2
     ,as_emp_name   out varcahr2
     ,as_emp_sub   out varcahr2
     ,as_count        out varcahr2
 )
이런식으로 고치고 싶거든요..
이것을 as_emp_name[50]  <== 이렇게 해야 될듯한데..
포인터를 넘기는 경우를 보지 못해서..계속 에러가 나네요..

proc에서 이런 경우는 어떻게 하는지..그냥 프로시져 쓰지 않고
proc내부에서 cursor을 사용해서 구현은 했지만서두...아직 초보여서..
듣기로는 procedure가 더 성능이 좋다고 하더군요...

왜 좋은 것인지는 모르지만...좋다고 하니...이렇게 구현하고 싶어서요..

june8th wrote:
가물 가물 한데다가, 님의 코드를 자세히 보지 않았습니다만..
SQL에서 여러개의 select 결과를 가져오려면,
결과가 담길 변수를 array로 잡고, CURSOR를 썼었습니다.
참고가 되면 좋겠네요..

언제나 즐프를 꿈꾸며~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.