Perl DBI не поддерживает результаты хранимых процедур MySQL
У меня проблема с выполнением хранимой процедуры из 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
Я бы;
используя клиент CLI mysql, он правильно выполняет хранимую функцию и возвращает существующий идентификатор или новый идентификатор.
Тем не менее, Perl будет возвращать только новый идентификатор (с увеличением на 1 при каждом запуске). Он также не сохраняет результат в базе данных. Похоже, он выполняет DELETE
на новый идентификатор сразу после update_current_stock_price
функция запущена.
Любая помощь? Делает ли Perl что-нибудь интересное с процедурами, о которых я должен знать?
Прежде чем вы спросите, у меня нет доступа к бинарному ведению журнала, извините.
3 ответа
Возможно, вы делаете это в транзакции, и это откатывается? Строка вставлена, но никогда не становится зафиксированной и не видна.
Я бы попробовал это на вашем dev-сервере и включил бы общий журнал запросов, если сомневаетесь.
Также вы можете захотеть узнать о синтаксисе INSERT ... ON DUPLICATE KEY UPDATE, который, вероятно, в любом случае может сделать то, что вы пытаетесь сделать.
Пытаться
$query_handle->dump_results(15, "\n", '|');
перед вызовом bind_columns, чтобы увидеть, действительно ли он возвращает результаты, вы также можете попробовать заменить SELECT storedprocedure
с SELECT * FROM storedprocedure
Вы должны проверить, что вы используете последнюю версию DBD::mysql (которая является MySQL-драйвером, используемым DBI). Раньше было несколько проблем с хранимыми процедурами, по крайней мере некоторые из них были исправлены в последних версиях. Может быть, эти ресурсы также полезны: