Aplikacija koju razvijam treba da formira izvestaj sa ćiriličnim podacima. U bazi se nalaze podaci koje korisnici mogu uneti i latinično.
Trenutno je "prevodilac" ugradjen u samu aplikaciju i radi konverziju na već pročitanim podacima iz baze. Prosečna obrada je oko 5 min (na tabeli od 40000 slogova sa 30 polja).
Pokušao sam da ceo problem rešim na nivou baznih procedura, ali brzina obrade je i dalje vrlo mala.
Evo i funkcije:
CREATE DEFINER = `root`@`%` FUNCTION `lat2cyr`(STRING_IN VARCHAR(500))
RETURNS varchar(500) CHARSET utf8
DETERMINISTIC
BEGIN
declare brojac INT DEFAULT 0;
declare pozicija INT DEFAULT 0;
declare STRING_OUT VARCHAR(4000);
declare latSingle VARCHAR(54) DEFAULT 'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
declare latDouble VARCHAR(18) DEFAULT 'DžDŽLjLJNjNJdžljnj';
declare cirSingle VARCHAR(54) DEFAULT 'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
declare cirDouble VARCHAR(18) DEFAULT 'Dž@Dž@Lj@Lj@Nj@Nj@dž@lj@nj@';
SELECT STRING_IN INTO STRING_OUT;
IF ((STRING_OUT = '-') OR (ISNULL(STRING_OUT))) THEN SET STRING_OUT = '';
ELSE
WHILE brojac < LENGTH(STRING_OUT) DO
SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,2), latDouble COLLATE utf8_bin);
IF pozicija <> 0 THEN
SET STRING_OUT = REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,2),MID(cirDouble,pozicija,2) COLLATE utf8_bin);
SET brojac = brojac + 2;
ELSE
SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,1), latSingle COLLATE utf8_bin);
IF pozicija <> 0 THEN
SET STRING_OUT = REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,1),MID(cirSingle,pozicija,1) COLLATE utf8_bin);
SET brojac = brojac + 1;
ELSE
SET brojac = brojac + 1;
END IF;
END IF;
END WHILE;
SET STRING_OUT = REPLACE(STRING_OUT,'@','');
END IF;
RETURN STRING_OUT;
END;
Da li je moguće optimizovati ovaj kod?
Tnx
[Ovu poruku je menjao vortex77 dana 28.10.2011. u 09:43 GMT+1]