Perl DBI не поддерживает результаты хранимых процедур MySQL - PullRequest
4 голосов
/ 26 марта 2010

У меня проблема с выполнением хранимой процедуры из 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 что-нибудь интересное с процедурами, о которых я должен знать?

Прежде чем вы спросите, у меня нет доступа к бинарному ведению журнала, извините.

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Возможно, вы делаете это в транзакции, и она откатывается? Строка вставлена, но никогда не становится зафиксированной и не видна.

Я бы попробовал его на вашем dev-сервере и включил общий журнал запросов, если сомневаетесь.

Также вы можете узнать о синтаксисе INSERT ... ON DUPLICATE KEY UPDATE, который, вероятно, в любом случае может сделать то, что вы пытаетесь сделать.

1 голос
/ 26 марта 2010

Вы должны проверить, что вы используете последнюю версию DBD :: mysql (который является MySQL-драйвером, используемым DBI). Раньше было несколько проблем с хранимыми процедурами, по крайней мере некоторые из них были исправлены в последних версиях. Может быть, эти ресурсы также полезны:

1 голос
/ 26 марта 2010

попробуй

$query_handle->dump_results(15, "\n", '|');

перед вызовом bind_columns, чтобы увидеть, действительно ли он возвращает результаты, вы также можете попробовать заменить SELECT storedprocedure на SELECT * FROM storedprocedure

...