Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Oracle: вставить в поле LONG RAW данные 
:(
    Опции темы
barabanshik
Дата 24.5.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



Добрый день, нужно вставить средствами 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

PM MAIL   Вверх
skyboy
Дата 24.5.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



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

ты уверен, что в ociexecute надо передавать $c, а не $q?
PM MAIL   Вверх
gta4kv
Дата 24.5.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 4
Всего: 91



skyboy
правду говорит, в OCIExecute надо передавать statement, а не connect indef.

Это сообщение отредактировал(а) gta4kv - 24.5.2008, 14:50
PM MAIL   Вверх
barabanshik
Дата 26.5.2008, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



Заменил $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

Это сообщение отредактировал(а) barabanshik - 26.5.2008, 08:33
PM MAIL   Вверх
gta4kv
Дата 26.5.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 4
Всего: 91



Код

 $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% рабочий пример.

Это сообщение отредактировал(а) gta4kv - 26.5.2008, 08:51
PM MAIL   Вверх
barabanshik
Дата 26.5.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



Select у меня тоже нормально работает, а вот update не хочет   smile 
PM MAIL   Вверх
barabanshik
Дата 26.5.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



обнаружил похожую ситуацию по этому адресу http://bugs.php.net/bug.php?id=37059 , так там еще какая-то функция OCIBindByName используется
PM MAIL   Вверх
skyboy
Дата 26.5.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



barabanshik, будь добр, удели полминуты статье по ociparse и посмотри, в каких случаях эта функция возвращает false, а в каких - ресурс результата выполнения. также обрати внимание на функцию oci_error, как ответ на вопрос "как же мне вывести текст ошибки?"

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

кстати, да.
вполне допускаю, что для вставки бинарных данных потребуется использование параметров в запросе.
но это не отменяет того, что я написал выше.
PM MAIL   Вверх
barabanshik
Дата 26.5.2008, 10:48 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



подкорректировал запрос,
 
Код

<?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: неверно задано шестнадцатеричное число
PM MAIL   Вверх
barabanshik
Дата 28.5.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



Перевел строку в 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 ! что здесь не так?
PM MAIL   Вверх
barabanshik
Дата 30.5.2008, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.5.2008

Репутация: нет
Всего: нет



Нашел как нужно было сделать  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);
?>


Спасибо всем за помощь и участие !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.