MySQL синтаксис хранимой процедуры для передачи Python переменной - PullRequest
0 голосов
/ 08 апреля 2020

Предположим, у меня есть хранимая процедура в MYSQL Workbench:

CREATE DEFINER=`root`@`localhost` PROCEDURE `calculateLeadTime`()
BEGIN
    SET @lastDate = (SELECT sessionDate FROM stock 
    WHERE product = (%s)
    ORDER BY stocksessionID DESC LIMIT 1);

    SET @secondLastDate = (SELECT sessionDate FROM stock WHERE product = (%s)
    ORDER BY stocksessionID DESC LIMIT 1, 1);

    SET @leadTime = (SELECT DATEDIFF(@lastDate, @secondLastDate));
    SET @lastStockSessionID = (SELECT stocksessionID
    FROM stock WHERE product = (%s) ORDER BY stocksessionID DESC LIMIT 1);

    UPDATE stock SET leadTime = (@leadTime)
    WHERE stocksessionID = @lastStockSessionID;
END

Какой синтаксис я использую в хранимой процедуре вместо (% s), поскольку она вызывает ошибку? Моя цель - вызвать его через Python и передать переменные в (% s) места.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Вам необходимо определить переменную в хранимой процедуре и использовать ее вместо %s.

CREATE DEFINER=`root`@`localhost` PROCEDURE `calculateLeadTime`(
in_product varchar(255)
)
BEGIN

DECLARE v_last_date date;
DECLARE v_second_last_date date;
DECLARE v_lead_time int;

SELECT sessionDate into v_last_date 
FROM stock 
WHERE product = in_product
ORDER BY stocksessionID DESC 
LIMIT 1;

SELECT sessionDate into v_second_last_date 
FROM stock 
WHERE product = in_product
ORDER BY stocksessionID DESC 
LIMIT 1;

SELECT DATEDIFF(v_last_date, v_second_last_date) into v_lead_time;

UPDATE stock SET leadTime = v_lead_time
WHERE stocksessionID = (
  SELECT stocksessionID
  FROM stock 
  WHERE product = in_product 
  ORDER BY stocksessionID DESC 
  LIMIT 1
);

END
0 голосов
/ 08 апреля 2020

Попробуйте это:

CREATE DEFINER=`root`@`localhost` PROCEDURE `calculateLeadTime`(
IN  product varchar(64))
BEGIN
    SET @lastDate = (SELECT sessionDate FROM stock 
    WHERE product = (%s)
    ORDER BY stocksessionID DESC LIMIT 1);

    SET @secondLastDate = (SELECT sessionDate FROM stock WHERE product = (%s)
    ORDER BY stocksessionID DESC LIMIT 1, 1);

    SET @leadTime = (SELECT DATEDIFF(@lastDate, @secondLastDate));
    SET @lastStockSessionID = (SELECT stocksessionID
    FROM stock WHERE product = (%s) ORDER BY stocksessionID DESC LIMIT 1);

    UPDATE stock SET leadTime = (@leadTime)
    WHERE stocksessionID = @lastStockSessionID;
END

и при вызове процедуры

cursor.execute('{CALL [calculateLeadTime](?)}',
              ('value'))

или

cursor.callproc('calculateLeadTime', ['product_name, ])

Передайте значение вашего продукта

...