Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
1

Ошибка в запросе

30.06.2016, 21:26. Просмотров 793. Ответов 14
Метки нет (Все метки)

Всем привет!

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

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE PROCEDURE calculate_precisions
(
    IN distribution VARCHAR(45),
    IN PRECISION VARCHAR(45), 
    IN total_schedules INT,
    IN destination VARCHAR(100)
)
BEGIN
 
  SET @distribution = distribution;
  SET @PRECISION = PRECISION;
  SET @total_schedules = total_schedules;
  SET @destination = destination;
 
  .......
 
END
SQL
1
2
3
You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'precision VARCHAR(45),
    IN total_schedules INT,
    IN destination VARCHAR(10' at line 4
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2016, 21:26
Ответы с готовыми решениями:

Ошибка в запросе
Сейчас учусь php и соответственно mysql, и кое-что не получается:( Вот задание...

Ошибка в запросе?
Всем привет! Вот запрос: select maker,...

Ошибка в запросе
Написал запрос: SELECT program.program_id, version.download_count...

Ошибка в запросе
как исправить

Ошибка в запросе
Вот запрос: SELECT DISTINCT d.Name, d.id, d1.id FROM "tab1" d, "tab2" d1 WHERE...

14
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 00:09 2
Лучший ответ Сообщение было отмечено Stas0n как решение

Решение

у вас уже была такая ошибка
PRECISION служебное слово, его нужно брать в обратные кавычки `PRECISION`
1
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 12:27  [ТС] 3
ничему жизнь не учит... спасибо!

Добавлено через 41 минуту
Сейчас ошибка дальше:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE PROCEDURE calculate_precisions
(
    IN distribution VARCHAR(45),
    IN forecast_precision VARCHAR(45),
    IN total_schedules INT,
    IN destination VARCHAR(100)
)
BEGIN
 
  SET @distribution = distribution;
  SET @forecast_precision = forecast_precision;
  SET @total_schedules = total_schedules;
  SET @destination = destination;
 
# ошибка в этой строчке
  SELECT COUNT(*)/@total_schedules FROM @distribution WHERE @forecast_precision < 0.25 INTO @share_0_25;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM @distribution WHERE @forecast_precision < 0.25 INTO @0_25;
 
  .....
 
 
END
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 12:34 4
Лучший ответ Сообщение было отмечено Stas0n как решение

Решение

показывайте сообщение об ошибке, в нем цитируемый кусок начинается непосредственно с ошибки

в данном случае проблема в том, что нельзя использовать переменные в качестве имен таблиц
обойти можно с помощью prepare
1
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 12:59  [ТС] 5
Спасибо!

Добавлено через 21 минуту
Я опять со своими тараканами...

при вызове процедуры
SQL
1
2
mysql> CALL calculate_precisions('distribution', 'forecast_cpm_precision_with_history', @total_schedules, 'auction_hist_cpm_precision');
ERROR 1146 (42S02): TABLE 'base.destination' doesn't exist
Стоит отметить, что distribution временная таблица
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 13:08 6
временная таблица видна в рамках сессии
процедура вызывается в той же сессии?
0
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 13:09  [ТС] 7
да, в той же.. в этом и проблема, почему не пойму, почему ошибка
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 13:45 8
у меня не получается воспроизвести вашу проблему

MySQL
1
2
3
4
5
6
7
8
mysql> create procedure test (tablename varchar(100))
    -> begin
    -> set @var = concat('select * from ', tablename);
    -> prepare zxc from @var;
    -> execute zxc;
    -> end;
    -> //
Query OK, 0 rows affected (0.04 sec)
в другой сессии

MySQL
1
2
3
4
5
6
7
mysql> create temporary table temp (id int);
Query OK, 0 rows affected (0.01 sec)
 
mysql> call test('temp');
Empty set (0.01 sec)
 
Query OK, 0 rows affected (0.01 sec)
0
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 13:47  [ТС] 9
Возможно, дело в том, что я инсертю так:

SQL
1
  INSERT INTO destination(processing_date, `0_25`, `0_25_share`, `25_50`, `25_50_share`, `50_75`, `50_75_share`, `75_100`, `75_100_share`) VALUES (CURDATE(), @0_25, @share_0_25, @25_50, @share_25_50, @50_75, @share_50_75, @75_100, @share_75_100);
Вот целиком процедура:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DELIMITER //
CREATE PROCEDURE calculate_precisions
(
    IN distribution VARCHAR(45),
    IN forecast_precision VARCHAR(45),
    IN total_schedules INT,
    IN destination VARCHAR(100)
)
BEGIN
 
  SET @forecast_precision = forecast_precision;
  SET @total_schedules = total_schedules;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision < 0.25 INTO @share_0_25;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision < 0.25 INTO @0_25;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.25 AND @forecast_precision < 0.5 INTO @share_25_50;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.25 AND @forecast_precision < 0.5 INTO @25_50;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.5 AND @forecast_precision < 0.75 INTO @share_50_75;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.5 AND @forecast_precision < 0.75 INTO @50_75;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.75 INTO @share_75_100;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.75 INTO @75_100;
 
 
  INSERT INTO destination(processing_date, `0_25`, `0_25_share`, `25_50`, `25_50_share`, `50_75`, `50_75_share`, `75_100`, `75_100_share`) VALUES (CURDATE(), @0_25, @share_0_25, @25_50, @share_25_50, @50_75, @share_50_75, @75_100, @share_75_100);
 
END//
DELIMITER ;
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 13:58 10
а при чем тут временная таблица distribution
ругается он на отсутствие таблицы destination
очевидно такой таблицы у вас в базе нет
0
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 14:04  [ТС] 11
Виноват, просто скопировал не то название. Но в том то и дело, что destination - это аргумент процедуры.

Вызов происходит так:
SQL
1
mysql> CALL calculate_precisions('distribution', 'forecast_cpm_precision_with_history', @total_schedules, 'auction_hist_cpm_precision');
таблица auction_hist_cpm_precision в базе есть железно. Видимо, я как-то неправильно передаю название таблице приинсерте?
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 14:09 12
да, нужно использовать prepare
выше я давал ссылку на статью
0
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 15:03  [ТС] 13
Спасибо! Использовал prepare, как Вы и посоветовали, вот запрос

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
DELIMITER //
CREATE PROCEDURE calculate_precisions
(
    IN forecast_precision VARCHAR(45),
    IN total_schedules INT,
    IN destination VARCHAR(100)
)
BEGIN
 
  SET @forecast_precision = forecast_precision;
  SET @total_schedules = total_schedules;
  SET @CURRENT_DATE = CURDATE();
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision < 0.25 INTO @share_0_25;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision < 0.25 INTO @0_25;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.25 AND @forecast_precision < 0.5 INTO @share_25_50;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.25 AND @forecast_precision < 0.5 INTO @25_50;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.5 AND @forecast_precision < 0.75 INTO @share_50_75;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.5 AND @forecast_precision < 0.75 INTO @50_75;
 
  SELECT COUNT(*)/@total_schedules FROM distribution WHERE @forecast_precision >= 0.75 INTO @share_75_100;
  SELECT ROUND(SUM(@forecast_precision)/COUNT(*), 3) FROM distribution WHERE @forecast_precision >= 0.75 INTO @75_100;
 
  SET @query = CONCAT
  (
    'INSERT INTO ', 
    destination, 
    '(processing_date, 0_25, 0_25_share, 25_50, 25_50_share, 50_75, 50_75_share, 75_100, 75_100_share) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' 
  );
  PREPARE stmt FROM @query;
  EXECUTE stmt USING @CURRENT_DATE, @0_25, @share_0_25, @25_50, @share_25_50, @50_75, @share_50_75, @75_100, @share_75_100;
 
END//
DELIMITER ;
проблема в том, что сейчас в базу пишутся одни нули..
0
retvizan
297 / 285 / 107
Регистрация: 09.04.2011
Сообщений: 798
01.07.2016, 16:20 14
MySQL
1
2
3
4
5
6
7
8
9
SET @query = CONCAT
  (
    'INSERT INTO ', 
    destination, 
    '(processing_date, 0_25, 0_25_share, 25_50, 25_50_share, 50_75, 50_75_share, 75_100, 75_100_share) VALUES (CURDATE(), @0_25, @share_0_25, @25_50, @share_25_50, @50_75, @share_50_75, @75_100, @share_75_100)' 
  );
 
PREPARE stmt FROM @query;
EXECUTE stmt;
0
Stas0n
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
01.07.2016, 16:40  [ТС] 15
Спасибо за подсказку, но сейчас все-равно значения вставляются неправильные... кажется, нельзя просто так использовать имена полей.. видимо, тоже через prepare придется
0
01.07.2016, 16:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2016, 16:40

Ошибка в запросе
Пытаюсь заполнить строки таблицы случанйыми данными, скрипт не работает, пишет,...

Ошибка в запросе к БД
надо составить запрос &quot;топ 10 городов страны с самым большим населением&quot; вот я...

SELECT ошибка в запросе
Есть БД, в ней таблица, и в ней такая информация. (СМ. скрин 1) Если написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru