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). Раньше было несколько проблем с хранимыми процедурами, по крайней мере некоторые из них были исправлены в последних версиях. Может быть, эти ресурсы также полезны:

Другие вопросы по тегам