Update blob

pi11

Новичок
Update blob

есть кусок кода -
PHP:
$i=0;
foreach (glob("*.doc") as $filename)
{
$i++;
$sql = "update errattblob set ole = :ole WHERE row_n=".$i;
$stmt = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ":ole", $clob, -1, OCI_B_BLOB);

$clob->savefile($filename);
oci_execute($stmt, OCI_DEFAULT);
oci_commit($conn);

}
вылетает с ошибкой - Warning: OCI-Lob::savefile(): OCILobWrite:
OCI_INVALID_HANDLE in C:\_tmp\attblob1\index.php on line 18

куда смотреть я уже не знаю!!
 

tony2001

TeaM PHPClub
$clob->savefile($filename);
oci_execute($stmt, OCI_DEFAULT);

эти две строки поменять местами.
 

pi11

Новичок
К сожалению не помогло, таже самая ошибка вылетает ;-(
 

tony2001

TeaM PHPClub
стоп, а с чего бы это ему быть валидным вообще?
твой запро его не возвращает.
апдейтить блобы через SET - это интересная мысль, но работать не будет.
надо делать SELECT ... FOR UPDATE; писать блоб и commit.
 

pi11

Новичок
Сделал так сначала -

PHP:
$i=2;
foreach (glob("*.doc") as $filename)
{
$i++;

$sql = "SELECT * FROM errattblob WHERE row_n = ".$i." FOR UPDATE";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt, OCI_DEFAULT) or die ("Unable to execute query\n");
$row = oci_fetch_assoc($stmt);

if (!$row){echo 'cant fetch query...';}

if ( !$row['OLE']->truncate() ) {
    oci_rollback($conn);
    die ("Failed to truncate LOB\n");
}

if ( !$row['OLE']->SaveFile($filename) ) {
    oci_rollback($conn);
} else {
   oci_commit($conn);

}
Выводится строка - - cant fetch query... и сответственно вылетает ошибка - Fatal error: Call to a member function truncate() on a non-object in C:\_tmp\attblob1\in2.php on line 18

P.S.
А set я взял из хелпа, правда там запрос использовался для CLOB...
 

pi11

Новичок
Вот структура таблицы -
PHP:
CREATE TABLE errattblob
    (erratt                         NUMBER NOT NULL,
    uname                          VARCHAR2(30) NOT NULL,
    datak                          DATE NOT NULL,
    ole                            BLOB,
    row_n                          NUMBER(*,0))
  PCTFREE     10
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  indx
  STORAGE   (
    INITIAL     16384
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
  LOB (OLE) STORE AS
  (
  TABLESPACE  indx
  STORAGE   (
    INITIAL     24576
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
   NOCACHE LOGGING
   CHUNK 8192
   PCTVERSION 10
  )
/
запрос типа - select * from errattblob where ole is null - возвращает 0 рядов...
 
Сверху