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

FireBird Q&A
[2940] Re:Re:[재질문]답변에 감사드립니다. 그런데../
까막.윤창희 [ggamagui] 2738 읽음    2008-09-30 15:57
초보 님이 쓰신 글 :
: 답변에 진심으로 감사드립니다.
: 답변해주신대로 리턴값이 두개라서 하나는 필요가 없어서
: (조건문에 사용을 해야 하므로)
: 리턴값이 하나만 있게 수정을 했습니다.
: (두번째 리턴값을 없앴습니다.)
:
: 아래부분이 수정한 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개 이상일 경우는 하나의 테이블이라고 생각하시고, 조인 걸어 사용하시면 됩니다.
: :
: :
: :
: : 위대한 단군혼이 살아있는 나라.... 대한민국.

안녕하세요. 까막입니다.

오류 메세지 자체는 한계값을 초과했다는 말인데요.
음... VARCHAR 값의 최대치가 32k 니까 32768까지 거든요.
아마 연산을 하면서 최대치를 초과하게 되는 것 아닌가요?
길이를 32765 를 주셨는데, 줄여 보시면 될거 같은데요.

꼭 그만큼의 길이를 사용하셔야 한다면, 계산식을 다시 살펴 보심이 좋을거 같네요.



위대한 단군혼이 살아있는 나라.... 대한민국.

+ -

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