2013-10-24 2 views
1

Я передаю даты как значения, разделенные запятой, например. param1 = 2012-01-12,2013-02-15,2012-12-01, и это будет введено в мою процедуру и как я могу получить значения всех дат, которые передаются в качестве параметра моей процедуре.Передача нескольких дат в процедуре Mysql

Я попытался использовать: выберите значение из таблицы1, где date_value in (param1); но это дает мне пустой набор.

Пожалуйста, скажите мне, как его решить.

Update:

DELIMITER $$ 
CREATE FUNCTION test2(dates text) 
RETURNS text READS SQL DATA 
BEGIN 
DECLARE abc text; 
DECLARE hi text; 

SET hi= concat('''',regex_replace('[,]',''',''',dates),''''); 

select value into abc from table1 where date_time in (hi); 

RETURN abc; 
END; 
$$ 
DELIMITER ; 

Мой Вклад в этой функции будет несколько дат: например: 2010-12-12,2012-12-10, .....

И моя функция regex_replace вернет мне дату в этом формате: '2010-12-12', '2012-12-10' и установит это переменной и передаст ее.

Но я всегда получаю пустой набор. Где я ошибся?

+0

попробуйте этот param1 = "'2012-01-12', '2013-02-15', '2012-12-01'" – Satya

+0

Нет, это не сработало. есть ли что-нибудь еще, что можно сделать? – DonRaHulk

+0

покажите свою процедуру и процедуру, пожалуйста, – Satya

ответ

1

То, что вы пытаетесь сделать в своем примере, - это сборка SQL на лету. Это необходимо сделать с помощью prepared statement. Однако подготовленные операторы не могут использоваться в функциях, и они также представляют угрозу безопасности, если кто-то может манипулировать переменной «даты».

Вместо этого я предлагаю разбивать переменную даты и вставлять ее в таблицу темп, а затем запрашивать ее. Я привел следующий пример:

DROP FUNCTION IF EXISTS checkCommaList; 
DELIMITER # 
CREATE FUNCTION checkCommaList(dates text) 
RETURNS text 
BEGIN 

    DECLARE abc text; 

    DROP TEMPORARY TABLE IF EXISTS checkCommaListTemp; 
    CREATE TEMPORARY TABLE checkCommaListTemp(textToSearch text); 

    WHILE (LOCATE(',',dates) > 0) 
    DO 
     SET @found = SUBSTRING(dates, 1, LOCATE(',', dates) - 1); 
     SET dates = SUBSTRING(dates, LOCATE(',', dates) + 1); 
     INSERT INTO checkCommaListTemp VALUES (@found); 
    END WHILE; 

    SELECT `value` INTO abc FROM table1 
     WHERE date_time IN (SELECT * FROM checkCommaListTemp); 

    DROP TEMPORARY TABLE checkCommaListTemp ; 

    RETURN abc; 

END; 
# 
DELIMITER ; 

DROP TABLE IF EXISTS table1; 
CREATE TABLE table1 (`value` text, date_time text); 
INSERT INTO table1 (`value`, date_time) VALUES ('a', '2010-12-12'); 

SELECT checkCommaList('2010-12-12,2012-12-10'); 

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

+0

Мне не разрешалось использовать временные таблицы, поэтому я разделил даты и сохранил их в разных переменных и достиг того же. – DonRaHulk

Смежные вопросы