Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Как в php использовать препаренный запрос между транзакциями?

$
0
0
Я заливаю в таблицу большущий массив данных с помощью отпрепаренного запроса. При этом, мне надо через каждые NNN записей делать commit.
Вот простой прототип программы, которая пытается коммитить каждую 2-ю запись:
!/usr/bin/php
<?php
$db = 'localhost/3050:/var/fbdb/test.fbd';
$username = 'SYSDBA';
$password = 'password';

$dbh = ibase_connect($db, $username, $password);
$trh = ibase_trans($dbh, IBASE_WRITE | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT);

$sql = 'INSERT INTO PREP (ID, NAME) VALUES (?, ?)';
$sth = ibase_prepare($trh, $sql);

for ($i = 1; $i < 10; $i++) {
  $name = "Name ". $i;

  echo "Debug: i = " . $i . "\tBefore ibase_execute.\n";
  if(!ibase_execute ($sth, $i, $name)) {
     echo ibase_errmsg();
     return;
  }

  if ($i % 2 == 0 ) {
    echo "Debug: i = " . $i . "\tBefore ibase_commit.\n";
    ibase_commit($trh);

    echo "Debug: i = " . $i . "\tBefore ibase_trans.\n";
    $trh = ibase_trans($dbh, IBASE_WRITE | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT);
 }
}

echo "End commit\n";
ibase_commit($trh);
ibase_free_query($sth);
ibase_close($dbh);
?>


В консоль получаю такой выход:
Debug: i = 1    Before ibase_execute.
Debug: i = 2    Before ibase_execute.
Debug: i = 2    Before ibase_commit.
Debug: i = 2    Before ibase_trans.
Debug: i = 3    Before ibase_execute.
PHP Warning:  ibase_execute(): invalid transaction handle (expecting explicit transaction start)  in /home/hme/test_prepared_commit.php on line 17
invalid transaction handle (expecting explicit transaction start)

Что же, получается, что в php препаренные запросы не живут между транзакциями? Надо заново препарить после комита?

Viewing all articles
Browse latest Browse all 1677

Trending Articles