Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

ukládání procedur?

Help
2009-02-07
2013-04-22
  • Petr Kramář
    Petr Kramář
    2009-02-07

    Zde se nejedná o chybu, ale za zmínku to možná stojí, protože ne všichni když píší proceduru tak názvy procedur, parametrů, sloupců, tabulek dávají mezi apostrofy což se mi stalo osudným když jsem ukládal do PHPMinAdmina proceduru a  potřebné věci v apostrofech nebyly. Uvedu na jednoduchém příkladu výběru podle ID: (této události nastáva pouze ukládate-li proceduru pomoci "SQL příkaz".)

    delmiter ^^
    CREATE PROCEDURE SELECT_BY_ID (IN P_id int)
    BEGIN
      SELECT id, email FROM table WHERE id = P_id;
    END ^^
    delmiter ;

    tak procedura se uložila dobře, ale spustit správně ji lze pouze přes "SQL příkaz"

    call SELECT_BY_ID(1);

    například, ale nelze ji použít přes rozhraní v PHPMinAdminu, ten si parametru "P_id" ani nevšimne, také nestačí uvozovat pouze název procedury a názvy parametrů

    delmiter ^^
    CREATE PROCEDURE `SELECT_BY_ID` (IN `P_id` int)
    BEGIN
      SELECT id, email FROM table WHERE id = P_id;
    END ^^
    delmiter ;

    skončí naprosto stejným výsledkem, čili zřejmě jediné správné řešení je:

    delmiter ^^
    CREATE PROCEDURE `SELECT_BY_ID` (IN `P_id` int)
    BEGIN
      SELECT `id`, `email` FROM `table` WHERE `id` = P_id;
    END ^^
    delmiter ;

    poté je vše bez problémů. Na konec bych ještě uvedl, že toto se stává pouze jen když v parametrech procedury jsou pouze integery, takže například:

    delimiter ^^
    CREATE PROCEDURE SELECT_BY_ID_EMAIL (IN P_id int, IN P_email varchar(60))
    BEGIN
      SELECT id, email FROM table WHERE id = P_id AND email = P_email;
    END ^^
    delimiter ;

    funguje bez problémů.

     
    • Jakub Vrána
      Jakub Vrána
      2009-02-16

      Mě to tedy bez problémů funguje (když tedy pominu překlep delmiter). Můžete to zkusit v SVN verzi?