Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет, помогите разобраться с хп.
Простой пример:
CREATE PROCEDURE select_data (in id int, out result int)
BEGIN
SET @rs = concat('select name from names where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
SET result = rs;
END
Правильно ли он написан?
Теперь я так понимаю, что из PHP мне нужно вызвать хп так: call select_data(1, @result); ?
А как теперь получить в PHP @result - чтобы дальше с ним работать?
Спасибо.
-----
Deadangel is falling ...
Неактивен
colonel написал:
Правильно ли он написан?
Нет. Вы можете в этом убедиться, создав свою процедуру и запустив её в консольном клиенте, например.
Таким образом имеет смысл отлаживать работу всех процедур, которые вы создаете.
colonel написал:
А как теперь получить в PHP @result - чтобы дальше с ним работать?
Неактивен
vasya написал:
colonel написал:
Правильно ли он написан?
Нет. Вы можете в этом убедиться, создав свою процедуру и запустив её в консольном клиенте, например.
Таким образом имеет смысл отлаживать работу всех процедур, которые вы создаете.delimiter $$
CREATE PROCEDURE select_data (in id int, out result varchar(255))
BEGIN
SET @rs = concat('select name into @res from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
SET result = @res;
END$$
Но в данном случае это масло маслянное. Следующий вариант по сути является тем же самымdelimiter $$
CREATE PROCEDURE select_data (in id int)
BEGIN
SET @rs = concat('select name into @result from a where id=', id);
PREPARE rs FROM @rs;
EXECUTE rs;
END$$colonel написал:
А как теперь получить в PHP @result - чтобы дальше с ним работать?
SELECT @result;
Да, спасибо, уже разобрался с этим. Но теперь возникли другие вопросы:
Например, как избавиться от такой ошибки:
Display width out of range for column '' (max = 255)
возникает при попытке создать процедуру. Я так понимаю, что идет превышение по длине строки. А как можно сделать перенос?
Спасибо.
Неактивен
colonel написал:
Например, как избавиться от такой ошибки:
Display width out of range for column '' (max = 255)
возникает при попытке создать процедуру.
А это чья ошибка - MySQL или вашего приложения?
Вы хоть код процедуры приведите.
Неактивен
vasya написал:
colonel написал:
Например, как избавиться от такой ошибки:
Display width out of range for column '' (max = 255)
возникает при попытке создать процедуру.
А это чья ошибка - MySQL или вашего приложения?
Вы хоть код процедуры приведите.
Спасибо, уже и с этим разобрался. После долгих поисков нашел в мануале mysql.com.
Еще раз спасибо за помощь.
Неактивен
Раз уж Вы так активно помогаете, не подскажете можно ли в процедуре использовать пустые значения по дефолту - как в PHP - что-то типа
CREATE PROCEDURE select_data (in id=0 int, in name="" varchar(255)
или может быть в теле самой процедуры? Т.е смысл такой, что если я вызываю функцию
call select_data(1)
, то у меня в самой процедуре переменная id=1, а name="", если я вызываю
call select_data(1, 'Alex')
, то у меня в самой процедуре переменная id=1, а name="Alex".
Спасибо.
Неактивен
Нет, так нельзя.
Если вы вызовете процедуру с числом параметров меньше, чем было определено при создании, то будет ошибка.
Неактивен
vasya написал:
Нет, так нельзя.
Если вы вызовете процедуру с числом параметров меньше, чем было определено при создании, то будет ошибка.
Да, я уже попробовал разными способами.
Еще раз спасибо.
Неактивен
vasya, а не подскажите, как я могу сделать множественный выбор и сохранить его в глобальную переменную (получается что это должен быть массив тогда, а массивы вроде не поддерживаются в хп).
например вот это не работает:
BEGIN
DECLARE hp1_ SMALLINT DEFAULT 0;
DECLARE hp2_ TINYINT DEFAULT 0;
DECLARE hp3_ TINYINT DEFAULT 0;
DECLARE hp4_ TINYINT DEFAULT 0;
DECLARE hp5_ SMALLINT DEFAULT 0;
SELECT hp1 INTO hp1_, hp2 INTO hp2_, hp3 INTO hp3_, hp4 INTO hp4_, hp5 INTO hp5_ FROM table WHERE login = login_;
SET @hp1 = hp1_;
SET @hp2 = hp2_;
SET @hp3 = hp3_;
SET @hp4 = hp4_;
SET @hp5 = hp5_;
END
Спасибо.
Неактивен
Вы можете сохранить данные во временную таблицу. Чем не массив
P.S. @hp5 - называется не глобальная, а пользовательская переменная.
P.P.S А каков сакральный смысл в присвоении значения сначала локальной переменной, а затем локальной переменной пользовательской переменной
Ведь SELECT hp1 INTO @hp1, ... будет тоже самое.
Неактивен
Ну я то не знал об этом ...
Вот вроде тут нашел подсказки, что для множественного выбора нужно использовать mysqli. Вот только я уже почти 1.5 часа бьюсь и ничего не выходит ... У Вас нет мыслей по этому поводу?
Нашел пример даже: MySQL Multiple Result Procs in PHP да вот все никак по нему сделать не могу ... Не поможете разобраться?
Да и уже тонну других примеров перепробовал и пересмотрел ... Пока решения нет.
Спасибо.
Отредактированно colonel (21.10.2009 07:17:31)
Неактивен
а можно склеить имя переменной в хп со строкой:
CREATE PROCEDURE sp_get_news(in news_id varchar(50))
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result FROM news WHERE id = news_id;
SET @(и вот здесь должна получиться переменная news3, которая образуется из "news" и news_id)
Спасибо.
Неактивен
Если я правильно понял вашу мысль:
Неактивен
Мысль то правильно поняли абсолютно, только вот теперь правильно ли я Вас понимаю:
CREATE PROCEDURE sp_get_news(in news_id varchar(50))
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result FROM news WHERE id = news_id and name = 'Test';
SET @(и вот здесь должна получиться переменная news3, которая образуется из "news" и news_id)
допустим news_id=1
результат
SELECT COUNT(*) INTO result FROM news WHERE id = news_id and name = 'Test';
вернет мне, скажем 3.
после вызова call sp_get_news(1) я должен получить переменную такую: @news1 = 3.
Следуя Вашему совету, я так понимаю, что я должен сделать так:
CREATE PROCEDURE sp_get_news(in news_id varchar(50))
set @news3 = concat('news',news_id); - но это уже по определению вернет мне @news3, а мне нужно @news1 - для id=1, для id=2 - @news2, для id=3 - @news3, ....
SELECT COUNT(*) INTO @news3 FROM news WHERE id = news_id and name = 'Test';
но разве когда я сделаю:
set @news3 = concat('news',news_id); - @news3
а потом
SELECT COUNT(*) INTO @news3 FROM news WHERE id = news_id and name = 'Test';
у меня @news3 не перезапишется? и, у меня тогда на выходе получится @news3, а мне нужно @news1.
Отредактированно colonel (22.10.2009 12:06:12)
Неактивен
Оказывается я вас неправильно понял.
Если мы заранее не знаем имя переменной, то единственный вариант использовать подготовленные выражения.
Неактивен