Хранимые процедуры, как начать?

vlad275

Новичок
Хранимые процедуры, как начать?

Скажите пожалуйста, могу я получить данные следующим способом?
Код:
DELIMITER $$

DROP PROCEDURE IF EXISTS `p4` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`()
BEGIN
SET @a=(SELECT intID, varcharStatus, varcharName FROM tCandidates);
END

DELIMITER ;
Код:
mysql_query('CALL p4()');
$res=mysql_query('SELECT @a');
 

vlad275

Новичок
А так можно?
Код:
DELIMITER $$

DROP PROCEDURE IF EXISTS `p4` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`(OUT intID, OUT varcharStatus, OUT varcharName)
BEGIN

DECLARE intID INT;
DECLARE varcharStatus, varcharName VARCHAR;
SELECT * INTO intID, varcharStatus, varcharName FROM `tCandidates`;
RETURN intID, varcharStatus, varcharName;
END

DELIMITER ;
 

findnext

Новичок
различие между процедурой и функцией зключается в том что в процедуре не используется return. Ты уж определись, что тебе нужно - процедура или функция.

настоятельно рекомендую посмотреть http://dev.mysql.com/doc/refman/5.0...-procedure.html
 

vlad275

Новичок
Мне нужно, чтобы возвращались значения полученные с помощью SELECT. Это может сделать процедура или функция?
 

Крот

Новичок
Тебе нужна функция. Процедура по-опредению ничего не возвращает; возвращает только функция.
 

vlad275

Новичок
Можно написать только
Код:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`()
BEGIN
      SELECT * FROM t
END
?

-~{}~ 08.10.09 18:13:

Автор оригинала: Крот
Тебе нужна функция. Процедура по-опредению ничего не возвращает; возвращает только функция.
Возвращает:
An OUT parameter passes a value from the procedure back to the caller
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
 

vlad275

Новичок
findnext, ты как помошник модератора будь сдержаннее и не флуди. Вопрос был "Будет работать вот такая sp?"

Код:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`()
BEGIN
      SELECT * FROM t
END
 

findnext

Новичок
vlad275
не будет

-~{}~ 09.10.09 13:23:

вообщем так.
По крайней мере насколько я знаю mysql не может возвратить из процедуры больше одного ряда. Немного перепутал с sybase sql.

-~{}~ 09.10.09 13:25:

[sql]
DELIMITER $$

DROP PROCEDURE IF EXISTS `tbl`.`test`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(OUT res CHAR(100))

BEGIN

SELECT `first_name` INTO res FROM users LIMIT 1;

END$$

DELIMITER ;

CALL test(@a);

SELECT @a

[/sql]

-~{}~ 09.10.09 13:27:

зачем тебе понадобилось делать так? может тут есть другое решение
 

vlad275

Новичок
Спасибо. Я только учусь писать sp. А вот так можно(привожу пример ниже)?
Код:
DELIMITER $$ 
DROP PROCEDURE IF EXISTS `tbl`.`test` $$ 
CREATE DEFINER = `root` @ `localhost` PROCEDURE `test` ( OUT res CHAR( 100 ) , OUT name CHAR(100))  
BEGIN  
 SELECT 'first_name', 'second_name' INTO res, res2 FROM users LIMIT 1 ;

END$$
DELIMITER;

CALL test(@a,@b);

SELECT @a, '-', @b
 

findnext

Новичок
[sql]
DELIMITER $$

DROP PROCEDURE IF EXISTS `tbl`.`test` $$

CREATE DEFINER = `root` @ `localhost` PROCEDURE `test` ( OUT res CHAR( 100 ) , OUT res2 CHAR(100))
BEGIN
SELECT `first_name`, `second_name` INTO res, res2 FROM users LIMIT 1 ;

END$$

DELIMITER;

CALL test(@a,@b);

SELECT @a, '-', @b

[/sql]

обрати внимание на кавычки ` <> '
 

Mols

Новичок
vlad275
Нормально возвращается масса рядов из процедур МуСКЛ. Просто внутри процедуры делается обычный селект как обычный запрос .
И возвращаются все ряды. (по крайней мере в 5.0 было так)


Проще говоря
[SQL]
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`()

BEGIN
SELECT * FROM t
END
[/SQL]
Должно работать.
 

findnext

Новичок
Mols
да, ты прав, так работает замечательно. Странно, но почему то никогда не использовал так процедуры
 

vlad275

Новичок
При использовании курсора не создается временная таблица :-(
Подскажите пожалуйста в чем может быть ошибка?
Код:
DELIMITER $$

DROP PROCEDURE IF EXISTS `p4` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`()
    SQL SECURITY INVOKER
    COMMENT 'Example'
BEGIN
 DECLARE varcharStatus VARCHAR(255);
 DECLARE cur1 CURSOR FOR SELECT varcharStatus FROM tCandidates;

 OPEN cur1;

 FETCH cur1 INTO varcharStatus;

 INSERT INTO tTemp2 VALUES (varcharStatus);

 SELECT varcharStatus FROM tTemp2;

 CLOSE cur1;
END $$

DELIMITER ;
Выдает:
Table 'variantdialog_99k_db1.ttemp2' doesn't exist
 
Сверху