SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.10.2010 23:36:59

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

COUNT(*) процедуры

Допустим, в теле процедуры напишу

SELECT * FROM table_name

Как теперь подсчитать количество возвращенных ей записей вне процедуры?
Пробовал различные вариации на тему
SELECT COUNT(*) FROM (CALL procedure_name)
Результат один - не помогло. Даже если присваивать имя временной таблицы. Как сделать правильно?

Неактивен

 

#2 13.10.2010 00:28:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: COUNT(*) процедуры

delimiter $$
create procedure count_row()
begin
 create temporary table tb_name select * from tbl;
end$$

test >call count_row();
Query OK, 0 rows affected (0.36 sec)

test >select count(*) from tb_name;
+----------+
| count(*) |
+----------+
|       11 |
+----------+
1 row in set (0.00 sec)

Неактивен

 

#3 13.10.2010 00:33:58

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: COUNT(*) процедуры

vasya написал:

delimiter $$
create procedure count_row()
begin
 create temporary table tb_name select * from tbl;
end$$

test >call count_row();
Query OK, 0 rows affected (0.36 sec)

test >select count(*) from tb_name;
+----------+
| count(*) |
+----------+
|       11 |
+----------+
1 row in set (0.00 sec)

Спасибо за вариант!
Однако не может ли случиться так, что при обращении к процедуре в одно и то же время возникнет путаница с данными в tb_name? Ну вдруг второй запрос изменит таблицу еще до того, как первый извлечет данные?
Или со временными таблицами это невозможно?

Неактивен

 

#4 13.10.2010 01:05:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: COUNT(*) процедуры

"A TEMPORARY table is visible only to the current connection, and is dropped automatically when the connection is closed. This means that two different connections can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY  table of the same name. (The existing table is hidden until the temporary table is dropped.)"

http://dev.mysql.com/doc/refman/5.1/en/ … table.html

Неактивен

 

#5 13.10.2010 13:10:52

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: COUNT(*) процедуры

Спасибо! Но речь идет как раз о двух запросах в рамках одного соединения.
На практике описанная вами ситуация мне подойдет, но хочу разобраться в теории на будущее.
Допустим, из скрипта php устанавливается соединение и выполняются запросы.
1)Первый запрос обращается к процедуре, которая создает временную таблицу.
Потом мы извлекаем результаты из временной таблицы.
2)Второй запрос обращается к этой же процедуре приблизительно в то же время, и изменяет эту же таблицу (ведь соединение одно) до того, как мы извлечем из нее данные в п.1)
Такое возможно?

Отредактированно Retrill (13.10.2010 14:00:00)

Неактивен

 

#6 13.10.2010 18:40:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: COUNT(*) процедуры

PHP не выполняет другие запросы по тому же соединению, пока оно не
освободилсось.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson