Как указать префикс базы данных для процедуры MySQL?

Тема в разделе "Базы данных", создана пользователем Extalionez, 16 авг 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Здравствуйте! Есть примерно следующий код
    Код:
    DELIMITER $$
     
    CREATE PROCEDURE `mydb`.`myProcedure` (IN dbPrefix VARCHAR(10), IN Id INT(11))
    BEGIN
    DECLARE peoples VARCHAR(28) DEFAULT CONCAT(dbPrefix, 'peoples');
    SELECT  * FROM peoples WHERE `id` = Id;
    END
    Но он, сволочь, почему-то берёт имя базы данных, для FROM, не из локальной переменной, указанной тут
    Код:
    DECLARE peoples VARCHAR(28) DEFAULT CONCAT(dbPrefix, 'peoples');
    ,а просто что ему указали
    Код:
    FROM peoples
    .
    У меня уже голова болит над этим думать. В общем просто подскажите как в процедуре сделать FROM из базы данных, префикс для которой должен передаваться в качестве параметра.:confused:
    :thenks::thenks::thenks:
    P.S.: Либо как экранировать ( в этом коде
    Код:
    FROM CONCAT(dbPrefix, peoples)
    , потому что эта сволочь на неё жалуется. Типа не может быть в запросе FROM этого (

    Решил по совету PhantomUA с помощью подготовки запроса.
     
  2. lift

    lift Читатель

    Заблокирован
    Регистр.:
    1 июл 2007
    Сообщения:
    2.226
    Симпатии:
    1.377
    Кинь код с правильным запросом и в FAQ топ.
     
  3. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Для данного конкретного примера - всё очень просто. нужно лишь не запутаться в конкатенации.
    Код:
    -- --------------------------------------------------------------------------------
    -- Routine DDL
    -- Note: comments before and after the routine body will not be stored by the server
    -- --------------------------------------------------------------------------------
    DELIMITER $$
     
    CREATE PROCEDURE `myProcedure` (IN dbPrefix VARCHAR(10), IN Id INT(11))
    BEGIN
    SET @my_query:=CONCAT("SELECT * FROM `",dbPrefix,"peoples` WHERE id = ",Id);
    PREPARE my_query FROM @my_query;
    EXECUTE my_query;
    END
    Если я конечно сам не запутался. Но сама идея проста и понятна как мне кажется.
    Вот только почему-то просто запрос из командной строки выполняется за 0.00 sec, а через CALL 0.04 sec. Правда у меня запрос намного сложней, со множеством INNER'ов и т.п., но всё-же. Правда это уже совершенно другая история.
     
    latteo и lift нравится это.
Статус темы:
Закрыта.