답변에 진심으로 감사드립니다.
답변해주신대로 리턴값이 두개라서 하나는 필요가 없어서
(조건문에 사용을 해야 하므로)
리턴값이 하나만 있게 수정을 했습니다.
(두번째 리턴값을 없앴습니다.)
아래부분이 수정한 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개 이상일 경우는 하나의 테이블이라고 생각하시고, 조인 걸어 사용하시면 됩니다.
:
:
:
: 위대한 단군혼이 살아있는 나라.... 대한민국.