Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Oracle: вставить в поле LONG RAW данные


Автор: barabanshik 24.5.2008, 10:52
Добрый день, нужно вставить средствами php строку из текстового файла в таблицу оракла в поле с типом данных long raw. Никогда не работал с таким типом, если кто сталкивался, подскажите как быть...

Выполняю следующий скрипт

Код

<?php
$c=OCILogon("user", "passwd", "BBB") ;
$lines=file('C:\222.txt');

foreach ($lines as $line){
$p=strpos($line,"+"); 
$id=substr($line,0,$p);
$st=substr($line,$p+1);
$q=OCIParse($c, "update TABLE1 set COLUMN2=".$st." where COLUMN1=".$id);
OCIExecute($c, OCI_DEFAULT);
};
OCIlogoff($c);
?>


и получаю ошибку ORA-01741 и ворнинг 
Warning: ociexecute(): supplied resource is not a valid oci8 statement resource

Автор: skyboy 24.5.2008, 13:42
Цитата(barabanshik @  24.5.2008,  09:52 Найти цитируемый пост)
$q=OCIParse($c, "update TABLE1 set COLUMN2=".$st." where COLUMN1=".$id);
OCIExecute($c, OCI_DEFAULT);

ты уверен, что в ociexecute надо передавать $c, а не $q?

Автор: gta4kv 24.5.2008, 14:49
skyboy, 
правду говорит, в OCIExecute надо передавать statement, а не connect indef.

Автор: barabanshik 26.5.2008, 08:32
Заменил $c на $q в функции OCIEXECUTE, теперь ругается так:
Warning: ociparse() [function.ociparse]: ORA-01741 и 
Warning: ociexecute() expects parameter 1 to be resource, boolean given in longraw.php on line 13

Автор: gta4kv 26.5.2008, 08:50
Код

 $conn = OCILogon($logdata[0],$logdata[1],$logdata[2]);
  $sql = "Select T.TEID, TEDATUM, TEUhrzeit, TEORT, TEBeschreibung, BIID as GRID, BIBezeichnung as Bezeichnung From TTermine T, TGruppetermin G, TBILDUNGSGANG B Where T.TEID=G.TEID AND GRID=B.BIID";
  $stmt = OCIParse($conn, $sql);
  OCIExecute($stmt);


Как 100% рабочий пример.

Автор: barabanshik 26.5.2008, 09:19
Select у меня тоже нормально работает, а вот update не хочет   smile 

Автор: barabanshik 26.5.2008, 09:36
обнаружил похожую ситуацию по этому адресу http://bugs.php.net/bug.php?id=37059 , так там еще какая-то функция OCIBindByName используется

Автор: skyboy 26.5.2008, 09:53
barabanshik, будь добр, удели полминуты статье по http://php.net/oci_parse и посмотри, в каких случаях эта функция возвращает false, а в каких - ресурс результата выполнения. также обрати внимание на функцию http://php.net/oci_error, как ответ на вопрос "как же мне вывести текст ошибки?"

Добавлено через 2 минуты и 22 секунды
Цитата(barabanshik @  26.5.2008,  08:36 Найти цитируемый пост)
так там еще какая-то функция OCIBindByName используется

кстати, да.
вполне допускаю, что для вставки бинарных данных потребуется использование параметров в запросе.
но это не отменяет того, что я написал выше.

Автор: barabanshik 26.5.2008, 10:48
подкорректировал запрос,
 
Код

<?php
$c=OCILogon("user", "passwd", "BBB") ;
$lines=file('C:\222.txt');

foreach ($lines as $line){
$p=strpos($line,"+"); 
$id=substr($line,0,$p);
$st=substr($line,$p+1);
$q=OCIParse($c, "update TABLE1 set COLUMN2=:st where COLUMN1=".$id);

oci_bind_by_name($q, ':st', $st);
$r=    OCIExecute($q, OCI_DEFAULT);
                        if (!$r) {
        $e = oci_error($q); // For oci_execute errors pass the statementhandle
        echo convert_cyr_string($e['message'],'d','w');
        }
};
OCIlogoff($c);
?>


теперь получаю другую ошибку
Warning: ociexecute() [function.ociexecute]: ORA-01465: ҐўҐа® § ¤ ® иҐбв ¤ж вҐаЁз®Ґ зЁб«® in longraw.php on line 14
ORA-01465: неверно задано шестнадцатеричное число

Автор: barabanshik 28.5.2008, 14:31
Перевел строку в hex, теперь ошибка 
Warning: ociexecute() [function.ociexecute]: ORA-01461: ¤®ЇгбЄ Ґвбп ЇаЁўп§Є  LONG § 票п в®«мЄ® ¤«п § ҐбҐЁп ў бв®«ЎҐж LONG in longraw.php on line 20
ORA-01461: допускается привязка LONG значения только для занесения в столбец LONG

Код

<?php
$c=OCILogon("user", "passwd", "BBB") ;
$lines=file('C:\222.txt');

foreach ($lines as $line){
$p=strpos($line,"+"); 
$id=substr($line,0,$p);
$st=substr($line,$p+1);
$strlength = strlen($st);
    
    for($i=0; $i<$strlength; $i++){
        $returnval .= dechex(ord(substr($st, $i, 1)));
    }
    $st=$returnval;
$q=OCIParse($c, "update TABLE1 set COLUMN2=:st where COLUMN1=".$id);

oci_bind_by_name($q, ':st', $st);
$r=    OCIExecute($q, OCI_DEFAULT);
                        if (!$r) {
        $e = oci_error($q); // For oci_execute errors pass the statementhandle
        echo convert_cyr_string($e['message'],'d','w');
        }
};
OCIlogoff($c);
?>


Так ведь у меня COLUMN2 и есть типа LONG RAW ! что здесь не так?

Автор: barabanshik 30.5.2008, 08:29
Нашел как нужно было сделать  smile , может кому по работе или другим каким нуждам пригодится , следующий код у меня нормально отработал:

Код

<?php
$c=OCILogon("user", "passwd", "BBB") ;
$lines=file('C:\222.txt');

foreach ($lines as $line){
$p=strpos($line,"+"); 
$id=substr($line,0,$p);
$st=(substr(rtrim($line),$p+1));

$q=OCIParse($c, "update TABLE1 set COLUMN2=:st where COLUMN1=".$id);

oci_bind_by_name($q, ':st', $st,-1,OCI_B_BIN);
$r=    OCIExecute($q, OCI_DEFAULT);
         if (!$r) {
        $e = oci_error($q); // For oci_execute errors pass the statementhandle
        echo convert_cyr_string($e['message'],'d','w');
        }
oci_free_statement($q);
};
OCIlogoff($c);
?>


Спасибо всем за помощь и участие !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)