Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Хранимые процедуры


Автор: Axiom 15.12.2011, 11:07
Доброго!
По воле случая столкнулся с хранимыми процедурами.
Со вставкой данных разобрался, а вот с их выборкой никак не получается.

Создаю процедуру:
Код

DROP PROCEDURE IF EXISTS `checKey`;

CREATE PROCEDURE `checKey` (INOUT email VARCHAR(50), IN `key` CHAR(32), OUT id INT, OUT password VARCHAR(30), OUT fullname VARCHAR(30))
    BEGIN
        SELECT id, email, password, fullname FROM table WHERE `key` = `key` AND email = email LIMIT 1;
    END


Вызываю процедуру следующим образом:
Код

$this->db->query("SET @email = '".$email."'");
$this->db->query("SET @key = '".$key."'");

$res = $this->db->query("CALL checKey(@email, @key, @id, @password, @fullname)")->fetch();
var_dump($res);


В результате возвращается:
Код

array(1) { ["id"] => NULL, ["email"] => [email protected], ["password"] => NULL, ["fullname"] => NULL }


Помогите разобраться.

Автор: Akina 15.12.2011, 11:17
Твоя процедура выбирает поля, но не помещает их в переменные.
http://dev.mysql.com/doc/refman/5.5/en/select-into.html

Автор: Axiom 15.12.2011, 12:06
Перевел запрос к такому виду:
Код

SELECT id, email, password, fullname INTO @id, @email, @password, @fullname FROM table WHERE `key` = `key` AND email = email LIMIT 1;


Получаю ошибку: ERROR: SQLSTATE[HY000]: General error

Автор: Akina 15.12.2011, 12:52
А теперь Вы делаете выборку в неявно определяемые локальные переменные... а неявное определение переменных у Вас, вероятно, отключено.

Цитата(Axiom @  15.12.2011,  13:06 Найти цитируемый пост)
Получаю ошибку: ERROR: SQLSTATE[HY000]: General error

Это сообщение НЕ является сообщением MySQL. 

Автор: Axiom 15.12.2011, 12:55
Цитата(Akina @  15.12.2011,  12:52 Найти цитируемый пост)
А теперь Вы делаете выборку в неявно определяемые локальные переменные... 

Т.е. нужно их заранее объявить?
Код

 SET @id = 0, @email = ''... etc;
 SELECT id, email, password, fullname INTO @id, @email, @password, @fullname FROM table WHERE `key` = `key` AND email = email LIMIT 1;


Просто, я так уже пробовал, но результат такой же, General Error.

Автор: Akina 15.12.2011, 13:05
Axiom, Вы принципиально намерены плодить хренову тучу переменных с идентичными именами, а потом не понимать, поле Вы используете или переменную, а если переменную - то какую именно... ?

Автор: Axiom 15.12.2011, 13:07
А разве это критично, использовать одноименные столбцам переменные?

Понятно ведь, что, допустим, id - это столбец, а @id - это переменная.

Автор: Akina 15.12.2011, 13:11
Цитата(Axiom @  15.12.2011,  14:07 Найти цитируемый пост)
Понятно ведь, что, допустим, id - это столбец

Можно, я напомню:

Цитата(Axiom @  15.12.2011,  12:07 Найти цитируемый пост)
Код

OUT id INT,


Автор: Axiom 15.12.2011, 15:13
Akina, я извиняюсь, но я не понял при чем тут OUT id INT.

Пробовал также:
Код

CREATE PROCEDURE `checKey` (IN email VARCHAR(50), IN `key` CHAR(32), OUT out1 INT, OUT out2 VARCHAR(30), OUT out3 VARCHAR(30))
    BEGIN
        SET @out1 = 0, @out2 = '', @out3 = '';
        SELECT id, password, fullname INTO @out1, @out2, @out3 FROM table WHERE `key` = `key` AND email = email LIMIT 1;
    END


Вызываю так:
Код

SET @email = $email;
SET @key = $key;
CALL checKey(@email, @key, @out1, @out2, @out3)


Но всё-равно получаю General Error.

Автор: Akina 15.12.2011, 15:32
Код

DROP PROCEDURE IF EXISTS `checKey`;

DELIMITER //

CREATE PROCEDURE `checKey` (INOUT p_email VARCHAR(50), IN p_key CHAR(32), OUT p_id INT, OUT p_password VARCHAR(30), OUT p_fullname VARCHAR(30))
    BEGIN
        SELECT id, email, password, fullname INTO p_id, p_email, p_password, p_fullname FROM table WHERE `key` = p_key AND email = p_email LIMIT 1;
    END;//

DELIMITER ;


Код

SET @email = '[email protected]';
SET @key = '12345';

CALL checKey(@email, @key, @id, @password, @fullname);

SELECT @email, @key, @id, @password, @fullname;

Вот что-то типа так...

Автор: Axiom 15.12.2011, 15:51
Akina, премного благодарен Вам.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)