Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
Судьба подкинула задачу брать данные из Oracle - первый раз сталкиваюсь с Oracle...суть в том что изучив форумы и изрядно полазив по интернету проблему не решил, возможно Вы мне поможете

Простые select, update и т.д. без проблем... но
Есть пользовательская функция ( скажем custom_user_function), в неё передаём CLOB возвращает функция CLOB, все это нужно реализовать в PHP

PHP 5.2

код:

$result = "большой и длинный XML";

$oracle_return = '';

$dsn = oci_connect( $db_user , $db_psw , $db );

if ( ! $dsn ) {
// ошибка соединения
$err = OCIError();
echo "ERROR: connection failed " . print_r( $err , true ) ."<BR>";}
else{
// к базе нормально подсоединяемся - это не проблема
$stmt = oci_parse( $dsn , 'BEGIN select custom_user_function( :inclob ) INTO :outclob FROM DUAL; END;' );

$in_clob = oci_new_descriptor( $dsn , OCI_D_LOB );
$out_clob = oci_new_descriptor( $dsn , OCI_D_LOB );

oci_bind_by_name( $stmt , ":inclob" , $in_clob , -1 , OCI_B_CLOB );
oci_bind_by_name( $stmt , ":outclob" , $out_clob , -1 , OCI_B_CLOB );

if( !oci_execute( $stmt , OCI_DEFAULT ) ){
$error = oci_error( $dsn );
}else{
$in_clob->write( $result );// здесь скрипт начинает ругаться
oci_commit( $dsn );

$oracle_return = $out_clob->load();// тоже ругается
}
}

выдает ошибку
Warning: OCI-Lob::write(): OCI_INVALID_HANDLE
Warning: OCI-Lob::load(): OCI_INVALID_HANDLE

Крутил вертел по разному исходя из советов которые нашел, но с Oracle слабо знаком , подскажите профессионалы как правильно реализовать ?
5 сен 11, 23:57    [11231737]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
Тифа
Member

Откуда:
Сообщений: 151
страно что ты сначало делаешь execute а потом только передаешь данные в ин параметр
в книге по оси советуется обрамлять вот так, мб у тебя пустой лоб возвращается?
if (is_object($lob)) { // protect against a NULL LOB
$data = $lob->load();
$lob->free();
echo $data;
}
6 сен 11, 07:20    [11231980]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
Так везде в руководствах написано, т.е. такого рода транзакции через commit идут
6 сен 11, 09:59    [11232322]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
на всякий случай посмотрел is_object - говорит объект есть
6 сен 11, 10:03    [11232346]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
такая конструкция работает, т.е. возвращает в :outclob значение:

$stmt = oci_parse( $dsn , 'BEGIN select custom_user_function( \'test\' ) INTO :outclob FROM DUAL; END;' );

проблема как передать длинную строку в функцию, как константу - ограничение, как CLOB - ошибка
6 сен 11, 10:23    [11232454]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
-2-
Member

Откуда:
Сообщений: 15330
AlekseyIvanov,

Создать локатор, должна быть функция типа createtemporary().
Записать туда значение.
Сделать execute().

AlekseyIvanov
Так везде в руководствах написано, т.е. такого рода транзакции через commit идут
И научиться читать.
6 сен 11, 10:27    [11232476]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
Понимаю что без язвы не обойтись, тем более что об Oracle я узнал только вчера, читать уже начал учится....

Вчера читал про локаторы, пробовал через них а именно empty_blob - опять таки что увидел в инете, большая просьба либо ткнуть в конкретный пример , либо если есть жеание реально помочь дать код... спасибо коллега....
6 сен 11, 10:36    [11232536]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
Тифа
Member

Откуда:
Сообщений: 151
Тифа
страно что ты сначало делаешь execute а потом только передаешь данные в ин параметр


хм не слова про коммит)
6 сен 11, 12:41    [11233614]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
просто потому что это не странно, так во всех примерах в инете по CLOB, видимо Вы не в теме по Oracle и PHP, по сути пришлось пойти другим путем т.к. помочь никто не в состоянии и времени нет, получилось немного через Ж, но зато все работает - и фиг с ним
6 сен 11, 14:00    [11234381]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
лха
Member

Откуда:
Сообщений: 678
$in_clob->write( $result ) должно быть до execute
$out_clob->load(); попробуй заменить на $out_clob->read($out_clob->size());
6 сен 11, 14:54    [11234887]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
Тифа
Member

Откуда:
Сообщений: 151
беру книгу The Underground PHP and Oracle Manual
скачаную с сайта оракла
глава 12 USING LARGE OBJECTS IN OCI8
раздел LOBs and PL/SQL procedures
кусок посвещеный ин параметру
<?php
$c = oci_connect('hr', 'hrpwd', 'localhost/XE');
$myblobid = 125;
$myv = 'a very large amount of binary data';
$s = oci_parse($c, 'begin inproc(:myblobid, :myblobdata); end;');
$lob = oci_new_descriptor($c, OCI_D_LOB);
oci_bind_by_name($s, ':MYBLOBID', $myblobid);
oci_bind_by_name($s, ':MYBLOBDATA', $lob, -1, OCI_B_BLOB);
$lob->writeTemporary($myv, OCI_TEMP_BLOB);
oci_execute($s);
$lob->close();
?>

прошу заметить где write и где execute

плохие у вас интернеты
6 сен 11, 14:54    [11234896]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
Других к сожалению не нашлось дружище )) вот например, первое что сразу прм нашлось

http://www.php.ru/manual/ref.oci8.html

там вот это

<?php
// by sergo at bacup dot ru

// Use option: OCI_DEFAULT for execute command to delay execution
OCIExecute($stmt, OCI_DEFAULT);

// for retrieve data use (after fetch):

$result = OCIResult($stmt, $n);
if (is_object($result)) $result = $result->load();

// For INSERT or UPDATE statement use:

$sql = "insert into table (field1, field2) values (field1 = 'value',
field2 = empty_clob()) returning field2 into :field2";
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save("some text");
OCICommit($conn);

?> 

save апосля execute.... фиг знает этот мой интернет )) спасибо коллеги я попробую Ваши советы
6 сен 11, 15:46    [11235481]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
-2-
Member

Откуда:
Сообщений: 15330
AlekseyIvanov
save апосля execute....
ты комменты почитал?!
// For INSERT or UPDATE statement use:
6 сен 11, 15:51    [11235551]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
Тифа
Member

Откуда:
Сообщений: 151
а кстати ссылка на книгу
http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html

мб кому полезна будет
6 сен 11, 16:00    [11235661]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь профи ORACLE+PHP  [new]
AlekseyIvanov
Member

Откуда:
Сообщений: 8
-2-
AlekseyIvanov
save апосля execute....
ты комменты почитал?!
// For INSERT or UPDATE statement use:


дружище ты чего-то доказать хочешь? конечно читал коменты.... поскольку о существовании Oracle я узнал только вчера вечером, пользовался всем что только нашел, почти перебором... пожалуйста не отвечай больше на этой ветке от тебя здесь толку меньше всего ( посмотри реальные советы от Тифа и Лха ) и учись помогать дружище , заранее спасибо за понимание ))

Тифа и Лха - пасиб коллеги ))
6 сен 11, 16:12    [11235846]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить