SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 28.04.2011 17:07:30

neitan
Участник
Зарегистрирован: 26.04.2011
Сообщений: 5

переменная в подзапросе в процедуре

Здравствуйте!
Как правильно вставить переменную в подзапрос в процедуре:

CREATE DEFINER = 'root'@'localhost' PROCEDURE `laserwork`(
       IN tLaser CHAR(5)
SET dTime=(SELECT time FROM tLaser ORDER BY id DESC LIMIT 1) - INTERVAL iVar MINUTE;

При таком использовании переменной tLaser, при запуске процедуры возвращается ошибка Table 'test.tlaser' doesn't exist

Неактивен

 

#2 28.04.2011 18:28:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: переменная в подзапросе в процедуре

Используйте PREPARE:
http://webew.ru/articles/178.webew

Неактивен

 

#3 29.04.2011 12:57:32

neitan
Участник
Зарегистрирован: 26.04.2011
Сообщений: 5

Re: переменная в подзапросе в процедуре

rgbeast написал:

Используйте PREPARE:
http://webew.ru/articles/178.webew

SET @dTime=('SELECT laser_power FROM ', tLaser , ' ORDER BY id DESC LIMIT 1') - INTERVAL iVar MINUTE;
PREPARE zxc FROM @dTime;
EXECUTE zxc;

Возвращает ошибку "Operand should contain 1 column(s)"

Неактивен

 

#4 30.04.2011 15:15:05

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

Re: переменная в подзапросе в процедуре

PREPARE подготавливает выражение из строки. Нужно подготавливать весь запрос,
а не кусок. А для конкатенации строк нужно использовать CONCAT, а не запятую.

Неактивен

 

#5 03.05.2011 13:43:07

neitan
Участник
Зарегистрирован: 26.04.2011
Сообщений: 5

Re: переменная в подзапросе в процедуре

paulus написал:

PREPARE подготавливает выражение из строки. Нужно подготавливать весь запрос,
а не кусок. А для конкатенации строк нужно использовать CONCAT, а не запятую.

ок, понял ошибку

BEGIN

SET @dTime=CONCAT('SELECT time FROM ', tLaser , ' ORDER BY id DESC LIMIT 1');
PREPARE zxc FROM @dTime;
EXECUTE zxc;
END

Возможно ли в этой же процедуре работать со значением полученным из подготовленного выражения?
Т.е передать какой-либо переменной значение полученное из EXECUTE zxc

Неактивен

 

#6 04.05.2011 01:35:15

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

Re: переменная в подзапросе в процедуре

SELECT @val := time FROM ...
и потом использовать @val в том месте процедуры, в котором нужно.

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

Неактивен

 

#7 05.05.2011 16:55:27

neitan
Участник
Зарегистрирован: 26.04.2011
Сообщений: 5

Re: переменная в подзапросе в процедуре

paulus написал:

SELECT @val := time FROM ...
и потом использовать @val в том месте процедуры, в котором нужно.

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

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

Задача состоит в следующем: создать процедуру или функцию(скорее всего функцию),

Есть несколько одинаковых таблиц lz1,lz2,lz3 и тд,
формат таблиц CREATE TABLE lz6 (id INT(11) NOT NULL AUTO_INCREMENT, time DATETIME NOT NULL, laser_power SMALLINT(6) NOT NULL, cnc_power SMALLINT(6) NOT NULL, PRIMARY KEY(id))
Задача:

1) входящим параметром задается имя таблицы;
2) делается селект, имя таблицы берется из параметра;
3) полученные из селета данные обрабатываются;
4) На входе получаем текстовую переменную

Сейчас функция выглядит так:

BEGIN
DECLARE iMin1 INTEGER DEFAULT 0;
DECLARE strData CHAR(255);
DECLARE iData INTEGER DEFAULT 0;
DECLARE dTime DATETIME;
SET iMin1 = minutes;
SET strData='';
IF iMin1 > 0 THEN
    WHILE iMin1 <> 0 DO
    SET dTime=(SELECT time FROM lz3 ORDER BY id DESC LIMIT 1)- INTERVAL iMin1 MINUTE;
    IF (SELECT laser_power FROM lz3 WHERE time=dTime) > 10 THEN
        SET iData=1;
    ELSE
        SET iData=0;
    END IF;
    IF strData='' THEN
        SET strData=iData;
    END IF;
    SET strData = CONCAT(strData,',',iData);
    SET iMin1=iMin1-1;
    END WHILE;
END IF;
  RETURN strData;
END


Хочется оптимизировать функция так, чтобы можно было скормить функции имя таблицы

Неактивен

 

#8 07.05.2011 01:35:50

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

Re: переменная в подзапросе в процедуре

А что Вас смущает то? Сделайте подготовленное выражение, которое
сохраняет результат в переменную. Используйте переменную для вы-
числений?

Неактивен

 

Board footer

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