Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    133

    Solito problema con CREATE FUNCTION

    Salve a tutti. E' un po' che sto cercando ovunque su internet, ma non riesco a trovare la risposta esatte. Allora: uso phpmyadmin, e ho recuperato su internet quest'interessante funzione mysql che utilizza l'algoritmo di levenshtein per calcolare la distanza fra due stringhe.

    codice:
    CREATE FUNCTION levenshtein (s1 VARCHAR(255), s2 VARCHAR(255))
      RETURNS INT
        DETERMINISTIC
          BEGIN
            DECLARE s1_len INT; 
            DECLARE s2_len INT;
            DECLARE i INT;
            DECLARE j INT;
            DECLARE c INT; 
            DECLARE c_temp INT; 
            DECLARE cost INT;
            DECLARE s1_char CHAR;
            DECLARE cv0, cv1 VARBINARY(256);
            SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
            IF s1 = s2 THEN
              RETURN 0;
            ELSEIF s1_len = 0 THEN
              RETURN s2_len;
            ELSEIF s2_len = 0 THEN
              RETURN s1_len;
            ELSE
              WHILE j <= s2_len DO
                SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
              END WHILE;
              WHILE i <= s1_len DO
                SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
                WHILE j <= s2_len DO
                    SET c = c + 1;
                    IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                    SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
                END WHILE;
                SET cv1 = cv0, i = i + 1;
              END WHILE;
            END IF;
            RETURN c;
          END
    ma se provo a crearla su mio DB ricevo sempre lo stesso errore:

    query SQL:

    CREATE FUNCTION levenshtein(
    s1 VARCHAR( 255 ) ,
    s2 VARCHAR( 255 )
    ) RETURNS INT DETERMINISTIC DECLARE s1_len INT;

    Messaggio di MySQL: Documentazione
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE s1_len INT' at line 5

    Ho come l'idea che abbia dei problemi a riconoscere degli spazi o qualcosa di simle, forse non prende bene gli "a capo"...e questa procedura non viene accettata ne dal phpmyadmin che gira in locale, da da quello in remoto. Come posso farE?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    La funzione in sè non ha alcun problema. L'ho appena provata in locale su sqlyog e non mi restituisce alcun errore.

    codice:
    DELIMITER $$;
    
    DROP FUNCTION IF EXISTS `prove`.`levenshtein`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `levenshtein`(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS int(11)
        DETERMINISTIC
    BEGIN
            DECLARE s1_len INT; 
            DECLARE s2_len INT;
            DECLARE i INT;
            DECLARE j INT;
            DECLARE c INT; 
            DECLARE c_temp INT; 
            DECLARE cost INT;
            DECLARE s1_char CHAR;
            DECLARE cv0, cv1 VARBINARY(256);
            SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
            IF s1 = s2 THEN
              RETURN 0;
            ELSEIF s1_len = 0 THEN
              RETURN s2_len;
            ELSEIF s2_len = 0 THEN
              RETURN s1_len;
            ELSE
              WHILE j <= s2_len DO
                SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
              END WHILE;
              WHILE i <= s1_len DO
                SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
                WHILE j <= s2_len DO
                    SET c = c + 1;
                    IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                    SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET ce_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
                END WHILE;
                SET cv1 = cv0, i = i + 1;
              END WHILE;
            END IF;
            RETURN c;
    END$$
    
    DELIMITER ;$$

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    133
    Si, hai ragione. Quando la creo in locale (sostituendo però il delimiter con \), funziona. Invece in remoto mi da dei problemi...

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(
    s1 VARCHAR( 255 ) ,
    s2 VARCHAR( 255 )
    ) RETURNS int( 11 ) D

    con questo codice:

    codice:
    CREATE FUNCTION `levenshtein` (
    s1 VARCHAR( 255 ) ,
    s2 VARCHAR( 255 )
    ) RETURNS int( 11 ) DETERMINISTIC BEGIN DECLARE s1_len INT;
    
    DECLARE s2_len INT;
    
    DECLARE i INT;
    
    DECLARE j INT;
    
    DECLARE c INT;
    
    DECLARE c_temp INT;
    
    DECLARE cost INT;
    
    DECLARE s1_char CHAR;
    
    DECLARE cv0, cv1 VARBINARY( 256 ) ;
    
    SET s1_len = CHAR_LENGTH( s1 ) ,
    s2_len = CHAR_LENGTH( s2 ) ,
    cv1 = 0x00,
    j =1,
    i =1,
    c =0;
    
    IF s1 = s2 THEN RETURN 0 ;
    
    ELSEIF s1_len =0 THEN RETURN s2_len;
    
    ELSEIF s2_len =0 THEN RETURN s1_len;
    
    ELSE WHILE j <= s2_len DO SET cv1 = CONCAT( cv1, UNHEX( HEX( j ) ) ) ,
    j = j +1;
    
    END WHILE;
    
    WHILE i <= s1_len DO SET s1_char = SUBSTRING( s1, i, 1 ) ,
    c = i,
    cv0 = UNHEX( HEX( i ) ) ,
    j =1;
    
    WHILE j <= s2_len DO SET c = c +1;
    
    IF s1_char = SUBSTRING( s2, j, 1 ) THEN SET cost =0;
    
    ELSE SET cost =1;
    
    END IF ;
    
    SET c_temp = CONV( HEX( SUBSTRING( cv1, j, 1 ) ) , 16, 10 ) + cost;
    
    IF c > c_temp THEN SET c = c_temp;
    
    END IF ;
    
    SET ce_temp = CONV( HEX( SUBSTRING( cv1, j +1, 1 ) ) , 16, 10 ) +1;
    
    IF c > c_temp THEN SET c = c_temp;
    
    END IF ;
    
    SET cv0 = CONCAT( cv0, UNHEX( HEX( c ) ) ) ,
    j = j +1;
    
    END WHILE;
    
    SET cv1 = cv0,
    i = i +1;
    
    END WHILE;
    
    END IF ;
    
    RETURN c;
    
    END
    ...non so se ho ancora dei problemi di delimitatori...non riesco a capire.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    133
    Ok, ho capito. Sul sito di free web hosting c'è una versione di mysql 4.x, quindi non supporta la sintassi CREATE TABLE.
    Maledizione, ma qualche free web hosting decente esiste? Uno che abbia almeno mysql 5.0, e dal quale sia possibile inviare email tramite script php? Qualche suggerimento?
    Grazie mille...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.