स्टोर प्रक्रिया के अंदर तारों में अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें और उन्हें तालिका फ़ील्ड में डालें?संग्रहित प्रक्रिया के अंदर अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें?
Firebird 2.5
स्टोर प्रक्रिया के अंदर तारों में अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें और उन्हें तालिका फ़ील्ड में डालें?संग्रहित प्रक्रिया के अंदर अल्पविराम से अलग स्ट्रिंग को कैसे विभाजित करें?
Firebird 2.5
यहां नमूने कैसे स्ट्रिंग विभाजित करने के लिए और WRI एक टेबल में उप-तार ते:
create procedure SPLIT_STRING (
AINPUT varchar(8192))
as
declare variable LASTPOS integer;
declare variable NEXTPOS integer;
declare variable TEMPSTR varchar(8192);
begin
AINPUT = :AINPUT || ',';
LASTPOS = 1;
NEXTPOS = position(',', :AINPUT, LASTPOS);
while (:NEXTPOS > 1) do
begin
TEMPSTR = substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS);
insert into new_table("VALUE") values(:TEMPSTR);
LASTPOS = :NEXTPOS + 1;
NEXTPOS = position(',', :AINPUT, LASTPOS);
end
suspend;
end
उपयोग स्थिति http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-position.html
और
SUSTRING देर में http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-substring.html
कार्यों का उपयोग करते हुए बयान
आपका स्वागत प्रकाशित! हालांकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। धन्यवाद – codingbadger
मैं माइकल के संस्करण संशोधित पोस्ट कर रहा हूँ, शायद यह किसी के लिए उपयोगी होगा।
परिवर्तन कर रहे हैं:
set term^;
create procedure split_string (
p_string varchar(32000),
p_splitter char(1))
returns (
part varchar(32000)
)
as
declare variable lastpos integer;
declare variable nextpos integer;
begin
p_string = :p_string || :p_splitter;
lastpos = 1;
nextpos = position(:p_splitter, :p_string, lastpos);
if (lastpos = nextpos) then
begin
part = substring(:p_string from :lastpos for :nextpos - :lastpos);
suspend;
lastpos = :nextpos + 1;
nextpos = position(:p_splitter, :p_string, lastpos);
end
while (:nextpos > 1) do
begin
part = substring(:p_string from :lastpos for :nextpos - :lastpos);
lastpos = :nextpos + 1;
nextpos = position(:p_splitter, :p_string, lastpos);
suspend;
end
end^
set term ;^
यह, एक बात को छोड़कर अच्छा लग रहा है 32000 कारण करने के लिए अपने Firebird सर्वर Varchar आकार घोषणा में "कार्यान्वयन सीमा पार हो गई" अपवाद समय सावधानी रखें। मैं बजाय ब्लॉब SUB_TYPE पाठ :) का उपयोग करने का सुझाव देते हैं
ऐसा ही एक समाधान मैं का उपयोग करें, कुछ समय पहले जिरी Cincura द्वारा स्टैक ओवरफ़्लो के http://blog.cincura.net/232347-tokenize-string-in-sql-firebird-syntax/
recreate procedure Tokenize(input varchar(1024), token char(1))
returns (result varchar(255))
as
declare newpos int;
declare oldpos int;
begin
oldpos = 1;
newpos = 1;
while (1 = 1) do
begin
newpos = position(token, input, oldpos);
if (newpos > 0) then
begin
result = substring(input from oldpos for newpos - oldpos);
suspend;
oldpos = newpos + 1;
end
else if (oldpos - 1 < char_length(input)) then
begin
result = substring(input from oldpos);
suspend;
break;
end
else
begin
break;
end
end
end
ठंडा। आपका बहुत बहुत धन्यवाद। –
बस ध्यान दें: यह 'एआईएनपीयूटी' के लिए '', 1,2'' 'के लिए कोई परिणाम नहीं लौटाएगा, लेकिन यह 'एआईपीपीयूटी' के लिए तीन सबस्ट्रिंग वापस करेगा जैसे' 1,2, ''। – Wodzu