У меня проблема с выполнением хранимой процедуры из Perl (с использованием модуля DBI). Если я выполню простое SELECT * FROM table
, проблем не будет.
Код SQL:
DROP FUNCTION IF EXISTS update_current_stock_price;
DELIMITER |
CREATE FUNCTION update_current_stock_price (symbolIN VARCHAR(20), nameIN VARCHAR(150), currentPriceIN DECIMAL(10,2), currentPriceTimeIN DATETIME)
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE outID INT;
SELECT `id` INTO outID FROM `mydb449`.`app_stocks` WHERE `symbol` = symbolIN;
IF outID > 0 THEN
UPDATE `mydb449`.`app_stocks`
SET `currentPrice` = currentPriceIN, `currentPriceTime` = currentPriceTimeIN
WHERE `id` = outID;
ELSE
INSERT INTO `mydb449`.`app_stocks`
(`symbol`, `name`, `currentPrice`, `currentPriceTime`)
VALUES (symbolIN, nameIN, currentPriceIN, currentPriceTimeIN);
SELECT LAST_INSERT_ID() INTO outID;
END IF;
RETURN outID;
END|
DELIMITER ;
Код Perl:
$sql = "select update_current_stock_price('$csv_result[0]', '$csv_result[1]', '$csv_result[2]', '$currentDateTime') as `id`;";
My::Extra::StandardLog("SQL being used: ".$sql);
my $query_handle = $dbh->prepare($sql);
$query_handle->execute();
$query_handle->bind_columns(\$returnID);
$query_handle->fetch();
Если я выполняю select update_current_stock_price('aapl', 'Apple Corp', '264.4', '2010-03-17 00:00:00') as
id ;
с помощью клиента CLI mysql, он правильно выполняет сохраненную функцию и возвращает существующий идентификатор или новый идентификатор.
Однако Perl будет возвращать только новый идентификатор (с увеличением на 1 при каждом запуске). Он также не сохраняет результат в базе данных. Похоже, что он выполняет DELETE
для нового идентификатора сразу после запуска функции update_current_stock_price
.
Любая помощь? Делает ли Perl что-нибудь интересное с процедурами, о которых я должен знать?
Прежде чем вы спросите, у меня нет доступа к бинарному ведению журнала, извините.