FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird Q&A
[2939] Re:[재질문]답변에 감사드립니다. 그런데../
초보 [] 2532 읽음    2008-09-30 12:22
답변에 진심으로 감사드립니다.
답변해주신대로 리턴값이 두개라서 하나는 필요가 없어서
(조건문에 사용을 해야 하므로)
리턴값이 하나만 있게 수정을 했습니다.
(두번째 리턴값을 없앴습니다.)

아래부분이 수정한 procedure 입니다.
create procedure lib_string_replace (
                     strg_in varchar( 32765),
                     strg_beg smallint,
                     strg_search varchar( 32765),
                     strg_replace varchar( 32765))
                   returns (
                     strg_out varchar( 32765))
  as
    declare variable strg_comp varchar( 32765);
    declare variable strg_pre varchar( 32765);
    declare variable strg_pst varchar( 32765);
    declare variable strg_len_orig smallint;
    declare variable strg_len_srch smallint;
    declare variable strg_len_repl smallint;

    begin
      /*
        replace substring
          str_beg : 1 ..

        examples:
          execute procedure lib_string_replace :strg_in, 1, 'to_replace', 'replacement'
                                               returning_values :strg_out, :strg_replaced;

          select my_table.my_text,
                   (select lib_string_replace.strg_out
                      from lib_string_replace( my_table.my_text, 1, 'MEMO:', 'Memo:'))
            from my_table;

          update my_table
            set my_table.my_text =
                  (select lib_string_replace.strg_out
                     from lib_string_replace( my_table.my_text, 1, 'MEMO:', 'Memo:'));
      */

      if (   (strg_in is null)
          or (strg_beg is null)
          or (strg_beg <= 0)
          or (strg_search is null)
          or (strg_replace is null))
        then
          begin
            strg_out = null;
/*          strg_replaced = null;  */
          end
        else
          begin
/*          strg_replaced = 0;  */
            execute procedure lib_string_len :strg_in
                                             returning_values :strg_len_orig;
            execute procedure lib_string_len :strg_search
                                             returning_values :strg_len_srch;
            execute procedure lib_string_len :strg_replace
                                             returning_values :strg_len_repl;

            while (strg_len_srch + strg_beg - 1 <= strg_len_orig)
              do
                begin
                  execute procedure lib_string_len :strg_in returning_values :strg_len_orig;

                  execute procedure lib_string_sub :strg_in, :strg_beg, strg_len_srch
                                                   returning_values :strg_comp;

                  if (strg_comp || '.' = strg_search || '.')
                    then
                      begin
                        execute procedure lib_string_sub :strg_in, 1, :strg_beg - 1
                                                         returning_values :strg_pre;
                        execute procedure lib_string_sub :strg_in, :strg_beg + :strg_len_srch,
                                                         :strg_len_orig - (:strg_beg + :strg_len_srch) + 1
                                                         returning_values :strg_pst;
                        strg_in = strg_pre || strg_replace || strg_pst;

                        strg_beg = strg_beg + strg_len_repl - strg_len_srch;

/*                      strg_replaced = strg_replaced + 1;   */
                      end 

                  strg_beg = strg_beg + 1;
                end

            strg_out = strg_in;
          end

      suspend;
    end

이렇게 수정한 후 퀴리를 실행하면 에러가 안나는데
commit 을 시키면
아래와 같은 에러가 납니다.
(또한 두번 실행하면 IBExpert 에서 procedure 에는 안보이는에 lib_string_replace 가 있다고 나옵니다)

Invalid token.
invalid request BLR at offset 30.
Implementation limit exceeded.
block size exceeds implementation restriction.

어느 부분이 잘못된건지 전혀 알수가 없는데..
다시한번 부탁드리면 답변에 감사드립니다.


까막.윤창희 님이 쓰신 글 :
: 초보 님이 쓰신 글 :
: : http://www.danner-net.de/fb.htm
: : 이곳에 있는 함수들을 사용하고 싶은데
: : 사용하는 방법을 모르겠습니다.
: :
: : 그냥 IbExport 에서 procedure 실행하니 Procedure 에 1개가 추가는 되는데
: : 쿼리 (select abc,lib_string_replace(abc,1,'-','') from test_table) 를 만들고
: : 실행을 하니 lib_string_replace 함수가 없다고 나옵니다.
: :
: : procedure 에서는 있는데..
: :
: : 어느 부분을  수정해야 하는건가요?
: :
: : lib_string_recplce 함수는 아래와 같습니다.
: : 부탁합니다
: :
: : create procedure lib_string_replace (
: :                      strg_in varchar( 32765),
: :                      strg_beg smallint,
: :                      strg_search varchar( 32765),
: :                      strg_replace varchar( 32765))
: :                    returns (
: :                      strg_out varchar( 32765),
: :                      strg_replaced smallint)
: :   as
: :     declare variable strg_comp varchar( 32765);
: :     declare variable strg_pre varchar( 32765);
: :     declare variable strg_pst varchar( 32765);
: :     declare variable strg_len_orig smallint;
: :     declare variable strg_len_srch smallint;
: :     declare variable strg_len_repl smallint;
: :
: :     begin
: :       /*
: :         replace substring
: :           str_beg : 1 ..
: :
: :         examples:
: :           execute procedure lib_string_replace :strg_in, 1, 'to_replace', 'replacement'
: :                                                returning_values :strg_out, :strg_replaced;
: :
: :           select my_table.my_text,
: :                    (select lib_string_replace.strg_out
: :                       from lib_string_replace( my_table.my_text, 1, 'MEMO:', 'Memo:'))
: :             from my_table;
: :
: :           update my_table
: :             set my_table.my_text =
: :                   (select lib_string_replace.strg_out
: :                      from lib_string_replace( my_table.my_text, 1, 'MEMO:', 'Memo:'));
: :       */
: :
: :       if (   (strg_in is null)
: :           or (strg_beg is null)
: :           or (strg_beg <= 0)
: :           or (strg_search is null)
: :           or (strg_replace is null))
: :         then
: :           begin
: :             strg_out = null;
: :             strg_replaced = null;
: :           end
: :         else
: :           begin
: :             strg_replaced = 0;
: :             execute procedure lib_string_len :strg_in
: :                                              returning_values :strg_len_orig;
: :             execute procedure lib_string_len :strg_search
: :                                              returning_values :strg_len_srch;
: :             execute procedure lib_string_len :strg_replace
: :                                              returning_values :strg_len_repl;
: :
: :             while (strg_len_srch + strg_beg - 1 <= strg_len_orig)
: :               do
: :                 begin
: :                   execute procedure lib_string_len :strg_in returning_values :strg_len_orig;
: :
: :                   execute procedure lib_string_sub :strg_in, :strg_beg, strg_len_srch
: :                                                    returning_values :strg_comp;
: :
: :                   if (strg_comp || '.' = strg_search || '.')
: :                     then
: :                       begin
: :                         execute procedure lib_string_sub :strg_in, 1, :strg_beg - 1
: :                                                          returning_values :strg_pre;
: :                         execute procedure lib_string_sub :strg_in, :strg_beg + :strg_len_srch,
: :                                                          :strg_len_orig - (:strg_beg + :strg_len_srch) + 1
: :                                                          returning_values :strg_pst;
: :                         strg_in = strg_pre || strg_replace || strg_pst;
: :
: :                         strg_beg = strg_beg + strg_len_repl - strg_len_srch;
: :
: :                         strg_replaced = strg_replaced + 1;
: :                       end
: :
: :                   strg_beg = strg_beg + 1;
: :                 end
: :
: :             strg_out = strg_in;
: :           end
: :
: :       suspend;
: :     end
:
: 안녕하세요.
: 까막입니다.
:
: 위 함수의 리턴값이 2개네요.
: 그러면   select abc,lib_string_replace(abc,1,'-','') from test_table   이렇게 하시면 오류가 납니다.
: 위처럼 하실 경우는 리턴값이 하나일 경우에나 사용 가능 하죠.
:
: SELECT A.abc, B.strg_out varchar,  B.strg_replaced
: FROM    Test_Table  A
:                                         LEFT JOIN         Lib_String_Replace(A.abc,1,'-','')    B
:                                ON (1 = 1)
:
: 이렇게 해보세요.
: 리턴값이 2개 이상일 경우는 하나의 테이블이라고 생각하시고, 조인 걸어 사용하시면 됩니다.
:
:
:
: 위대한 단군혼이 살아있는 나라.... 대한민국.

+ -

관련 글 리스트
2932 [질문] 초보 2198 2008/09/26
2938     Re:[질문] 까막.윤창희 1936 2008/09/30
2939         Re:[재질문]답변에 감사드립니다. 그런데../ 초보 2532 2008/09/30
2940             Re:Re:[재질문]답변에 감사드립니다. 그런데../ 까막.윤창희 2739 2008/09/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.