Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Динамический запрос / 16 сообщений из 16, страница 1 из 1
17.07.2018, 21:23
    #39675272
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
Подскажите, почему вызов хранимой процедуры не возвращает значения.

Код: 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.
DROP PROCEDURE IF EXISTS request.sp_get_requests_list;

CREATE DEFINER = `root` @`%`
PROCEDURE request.sp_get_requests_list(IN in_person_id       int(20),
                                       IN in_regdate_start   date)
   LANGUAGE SQL
   DETERMINISTIC
   CONTAINS SQL
   SQL SECURITY DEFINER
BEGIN
   DECLARE v_and_flag       BOOL DEFAULT FALSE;
   DECLARE v_where_clause   VARCHAR(255) DEFAULT '';
   DECLARE v_role_code      VARCHAR(255);
   DECLARE v_sql            VARCHAR(1024) DEFAULT '';
   SET @in_regdate_start = 'in_regdate_start';

   SET v_where_clause = CONCAT(' WHERE createdate=?');

   SET @sql = CONCAT('SELECT * FROM vw_requests_list', v_where_clause);

   PREPARE STMT FROM @sql;

   EXECUTE STMT USING @in_regdate_start;

   DEALLOCATE PREPARE STMT;
END;


call sp_get_requests_list(1,STR_TO_DATE('01.02.2016',"%d.%m.%Y")) ;





Подозреваю, что дело в форматах даты.
...
Рейтинг: 0 / 0
17.07.2018, 21:50
    #39675280
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
гггг-mm-dd так надо
...
Рейтинг: 0 / 0
17.07.2018, 21:54
    #39675282
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
wsnet,

CONCAT(' WHERE createdate=?'); это что???
...
Рейтинг: 0 / 0
17.07.2018, 21:57
    #39675283
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
Код: sql
1.
SET @sql = 'SELECT * FROM vw_requests_list WHERE createdate=?';
...
Рейтинг: 0 / 0
17.07.2018, 21:57
    #39675284
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
вадя, а как не зависимо от региональных настроек даты это сделать, ибо обычный запрос типа
Select * from vw_requests_list where createdate=STR_TO_DATE('01.02.2016',"%d.%m.%Y")
Данные возвращает!
...
Рейтинг: 0 / 0
17.07.2018, 21:59
    #39675285
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
SET @in_regdate_start = in_regdate_start;
...
Рейтинг: 0 / 0
17.07.2018, 21:59
    #39675286
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
вадя, там часть where удалил, забыл concat убрать, правда это не меняет ничего
...
Рейтинг: 0 / 0
17.07.2018, 22:01
    #39675287
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
wsnetвадя, а как не зависимо от региональных настроек даты это сделать, ибо обычный запрос типа
Select * from vw_requests_list where createdate=STR_TO_DATE('01.02.2016',"%d.%m.%Y")
Данные возвращает!это правильно, мой вариант, если не использовать STR_TO_DATE
...
Рейтинг: 0 / 0
17.07.2018, 22:04
    #39675288
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
wsnetвадя, там часть where удалил, забыл concat убрать, правда это не меняет ничего
Код: sql
1.
SET @in_regdate_start = 'in_regdate_start'; 

присвоение строки

Код: sql
1.
SET @in_regdate_start = in_regdate_start; 

присвоение значения из входного параметра
...
Рейтинг: 0 / 0
17.07.2018, 22:08
    #39675290
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
вадя,

Так как будет выглядеть хранимая процедура вне зависимости от региональных настроек даты ?
...
Рейтинг: 0 / 0
18.07.2018, 06:52
    #39675357
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
wsnetТак как будет выглядеть хранимая процедура вне зависимости от региональных настроек даты ?так как у тебя - главное ей в правильном формате скормить дату
...
Рейтинг: 0 / 0
18.07.2018, 07:22
    #39675363
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
вадя,

с USING получилось

Код: 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.
DROP PROCEDURE IF EXISTS request.sp_get_requests_list;

CREATE DEFINER = `root` @`%`
PROCEDURE request.sp_get_requests_list(IN in_person_id       int(20),
                                       IN in_regdate_start   date)
   LANGUAGE SQL
   DETERMINISTIC
   CONTAINS SQL
   SQL SECURITY DEFINER
BEGIN
   DECLARE v_and_flag       BOOL DEFAULT FALSE;
   DECLARE v_where_clause   VARCHAR(255) DEFAULT '';
   DECLARE v_role_code      VARCHAR(255);
   DECLARE v_sql            VARCHAR(1024) DEFAULT '';
   SET @in_regdate_start = in_regdate_start;

   SET v_where_clause = ' WHERE createdate=?';

   SET @sql = CONCAT('SELECT * FROM vw_requests_list', v_where_clause);

   PREPARE STMT FROM @sql;

   EXECUTE STMT USING @in_regdate_start;

   DEALLOCATE PREPARE STMT;
END;



Делаю вот так - не получается, почему так ?

Код: 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.
DROP PROCEDURE IF EXISTS request.sp_get_requests_list;

CREATE DEFINER = `root` @`%`
PROCEDURE request.sp_get_requests_list(IN in_person_id       int(20),
                                       IN in_regdate_start   date)
   LANGUAGE SQL
   DETERMINISTIC
   CONTAINS SQL
   SQL SECURITY DEFINER
BEGIN
   DECLARE v_and_flag       BOOL DEFAULT FALSE;
   DECLARE v_where_clause   VARCHAR(255) DEFAULT '';
   DECLARE v_role_code      VARCHAR(255);
   DECLARE v_sql            VARCHAR(1024) DEFAULT '';

   SET v_where_clause = CONCAT(' WHERE createdate=', in_regdate_start);

   SET @sql = CONCAT('SELECT * FROM vw_requests_list', v_where_clause);

   PREPARE STMT FROM @sql;

   EXECUTE STMT;

   DEALLOCATE PREPARE STMT;
END;
...
Рейтинг: 0 / 0
18.07.2018, 07:52
    #39675378
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
автор
Код: sql
1.
SET v_where_clause = CONCAT(' WHERE createdate=', in_regdate_start);



Вот тут ошибка. Вы после конкатенации получите нечто типа
Код: sql
1.
WHERE createdate=2018-01-01


что будет преобразовано в
Код: sql
1.
WHERE createdate=2016


Правда, слегка не то, что нужно?
Обрамите присоединяемое значение одинарными кавычками, чтобы после конкатенации получилось не сравнение с результатом арифметического выражения, а сравнение с литералом.
...
Рейтинг: 0 / 0
18.07.2018, 11:29
    #39675521
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
Akina,
Пробую
Код: sql
1.
call sp_get_requests_list(1,STR_TO_DATE('01.02.2016',"%d.%m.%Y")) ;



Получаю ошибку
Код: sql
1.
Unknown column 'in_regdate_start' in 'where clause'



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET v_where_clause = CONCAT(' WHERE createdate=', 'in_regdate_start');

   SET @sql = CONCAT('SELECT * FROM vw_requests_list', v_where_clause);

   PREPARE STMT FROM @sql;

   EXECUTE STMT;

   DEALLOCATE PREPARE STMT;
...
Рейтинг: 0 / 0
18.07.2018, 11:46
    #39675539
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
wsnet,

Код: sql
1.
 SET @v_where_clause = CONCAT(' WHERE createdate= \'', in_regdate_start,'\'');
...
Рейтинг: 0 / 0
18.07.2018, 12:33
    #39675579
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический запрос
вадя,

спасибо огромное, в точку.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Динамический запрос / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]