Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Как правильно вставить переменную в подзапрос в процедуре:
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
Неактивен
Используйте PREPARE:
http://webew.ru/articles/178.webew
Неактивен
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)"
Неактивен
PREPARE подготавливает выражение из строки. Нужно подготавливать весь запрос,
а не кусок. А для конкатенации строк нужно использовать CONCAT, а не запятую.
Неактивен
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
Неактивен
SELECT @val := time FROM ...
и потом использовать @val в том месте процедуры, в котором нужно.
Переменные процедуры, к сожалению, в таком контексте использовать
не удастся.
Неактивен
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
Хочется оптимизировать функция так, чтобы можно было скормить функции имя таблицы
Неактивен
А что Вас смущает то? Сделайте подготовленное выражение, которое
сохраняет результат в переменную. Используйте переменную для вы-
числений?
Неактивен