PHP 5.2.5 и CLOB (ошибка или ...)

SergeyNZ

Новичок
PHP 5.2.5 и CLOB (ошибка или ...)

Пытаюсь перейти с Apache 1.3 + PHP 4.3.8 на Apache 2.2 + PHP 5.2.5
Возникла следующая проблема
Есть процедура на Oracle, котрая при mode=1 принимает CLOB и записывает его в таблицу(код пропущен),
в остальных случаях возвращает CLOB
CREATE OR REPLACE PROCEDURE .test (p_mode IN Integer, P_CLOB IN OUT CLOB) IS
BEGIN
if p_mode=1 then
--insert into table
NULL;
else
P_CLOB := 'Test message';
end if;
END;

и есть простой код на PHP

PHP:
 $oracon = ocilogon("Login", "Pas", "STR");
  
     $mode = 2;
     $fl_soob = "Input Clob";
  
     $s = OCIParse($oracon, "begin test(:mode, :fl_soob); end;"); 
     OCIBindByName($s, ":mode", $mode);
     $lob = ocinewdescriptor($oracon, OCI_DTYPE_LOB );
     if(mode==1) //insert clob
         $lob->WriteTemporary($fl_soob); 
     else  //select clob
         $lob->WriteTemporary('  '); 
     OCIBindByName($s, ":fl_soob", $lob, -1, OCI_B_CLOB);
     OCIExecute($s, OCI_DEFAULT); 
     OCICommit($oracon); 
     $fl_soob = $lob->load();
     echo  $fl_soob;

на PHP 4 возвращается Test message
на PHP 5 возвращается Te
если написать так $lob->WriteTemporary(' '); //3 пробела
то на PHP5 возвращается Tes

Как сделать так чтобы работало правильно т.е. как на PHP4

Спасибо
 

tony2001

TeaM PHPClub
Я правильно понимаю, что вы выбираете CLOB c текстом для чтения, затем ПИШЕТЕ в него 3 пробела и после этого ожидаете получить оттуда "Test message"?
 

SergeyNZ

Новичок
???
по моему у меня сначало идет
if(mode==1) //insert clob
$lob->WriteTemporary($fl_soob);
else //select clob
$lob->WriteTemporary(' ');
OCIBindByName($s, ":fl_soob", $lob, -1, OCI_B_CLOB);

а вот здесь я получаю данные
OCIExecute($s, OCI_DEFAULT);
и почему я не должен получить
"Test message"?
Я передал на сервер 3 пробела а сервер должен мне вернуть
Test message
парметр в процедуре IN OUT
 

tony2001

TeaM PHPClub
У функции oci_bind_by_name() 4-й параметр maxlength указывает длину CLOBа, надо его использовать, а не 3 пробела.
Без этого параметра получается, что биндится клоб длиной в 3 символа, в этот же буфер и приходит "Tes".
 

SergeyNZ

Новичок
C WWW.PHP.NET

Если вы хотите привязать абстрактный тип данных
(LOB/ROWID/BFILE), то вам необходимо сначала создать дескриптор с помощью oci_new_descriptor(). Параметр length не используется с абстрактными типами данных и должен быть равен -1. Параметр type говорит Oracle, какой тип дескриптора мы хотим использовать. Возможные значения этого параметра:

На 4 PHP то все работало
 

tony2001

TeaM PHPClub
>else //select clob
>$lob->WriteTemporary(' ');

убери вот это.

>На 4 PHP то все работало

на 4 PHP много чего было неправильно.
 
Сверху