Witam. Mam dwa ciągi, przechowywane w zmiennej Varchar2, składające się z 49 znaków - 43 zera i 6 jedynek. Jeden z nich jest wzorcem. Moim zadaniem jest policzyć, ile razy na tej samej pozycji w obu ciągach występuje 1 (czyli odpowiednik logicznego AND), np.:
Wzór: 0010100000100000100000000000000100000000010000000
Ciąg: 0000100010000010000000000000000100001100000000000
Jak widać w tym przypadku jako wynik zostanie zwrócone: 2. Funkcja odpowiadająca za zliczanie:
CREATE OR REPLACE FUNCTION check_bet (bet_number NUMBER) RETURN NUMBER IS
pattern VARCHAR2(50);
other VARCHAR2(50);
iterator NUMBER;
counter NUMBER;
pattern_char CHAR;
other_char CHAR;
CURSOR cur(id NUMBER) IS SELECT balls FROM results WHERE id_bet = id;
BEGIN
iterator := 0;
OPEN cur(iterator);
FETCH cur INTO pattern;
CLOSE cur;
iterator := bet_number;
OPEN cur(iterator);
FETCH cur INTO other;
CLOSE cur;
counter := 0;
FOR i IN 1..50 LOOP
pattern_char := substr(pattern, i, 1);
other_char := substr(other, i, 1);
IF pattern_char = '1' AND other_char = '1' THEN
counter := counter + 1;
END IF;
END LOOP;
RETURN counter;
END;
Funkcja działa i zwraca prawidłowe wyniki. Moje pytanie jest jednak takie: czy da się to rozwiązać “lepiej”? Chciałbym, żeby cała ta procedura działa szybciej, bo jak łatwo się domyślić w przypadku porównania 100 tys. takich ciągów trochę czasu to zajmie.