Вывод из CLOB полей

[SDem]

Новичок
Вывод из CLOB полей

Сущ-ет таблица с CLOB полями.Соответственно делаем

$rs = ociparse($link,$query);
ociexecute($rs);

while (ocifetchinto($rs,$row))
{
print_r($row);
}
на выходе получаем что то вроде:
Array ( [0] => Помощь [1] => OCI-Lob Object ( [descriptor] => Resource id #6 ) [2] => 0 )
Вобщем вопрос в том, каквытащить текст из CLOB?

Весь инет облазил,нашел море подобных вопросов на ворумах, но ни одного ответа на них. Наверное злой рок :)

-~{}~ 21.03.06 19:40:

Сорри .. сам разобрался после полутора часов поиска -)

Сделал
echo $row[1]->load(); и всё заработало:)
 

Falc

Новичок
А в ман посмотреть не пробовал?

Есть флаг:
OCI_RETURN_LOBS

[m]oci_fetch_array[/m]
 

alxg

Новичок
PHP:
function selectObjects($table,$where = null) {
	$sql = "SELECT * FROM " . $this->prefix.$table;
	if ($where != null) $sql .= " WHERE $where";

	$stmt = OCIParse($this->connection, $sql);
	@OCIExecute($stmt, OCI_DEFAULT);
	$records = array();
	$ncols = OCINumCols($stmt);
	while (OCIFetch($stmt)) {
		$columns = array();
		for ($i = 1; $i <= $ncols; $i++) {
			$column_name = $this->quote_fname(OCIColumnName($stmt, $i));
			$column_type = OCIColumntype($stmt, $i);
			$column_value = OCIResult($stmt, $i);
			if ($column_type == 'CLOB' && is_object($column_value)) $column_value = $column_value->load();
			if ($column_value == null) $column_value = "";
			$columns[$column_name] = $column_value;
		}
		$records[] = $columns;
	}
	OCIFreeStatement($stmt);
	return $records;
}
 

tony2001

TeaM PHPClub
весь этот ужасный код заменяется на одну строку с oci_fetch_array() с флагом, указанным в посте Falc'а.
 

alxg

Новичок
У меня php4.
К тому же весь код одной строкой заменить не получится :)
 

tony2001

TeaM PHPClub
для PHP4 рекомендуется взять http://pecl4win.php.net/ext.php/php_oci8.dll
но даже в PHP4 есть ocifetchinto(), которая заменяет ocifetch(), ociresult() & ocilobload().
 

alxg

Новичок
tony2001, может подскажешь, как можно реализовать вставку в таблицу где есть clob поле (поля) если заранее не известны их типы.

привожу кусок своего еще более ужасного кода:)
здесь перед вставкой я использую getDataDefinition для получения типов полей таблицы.

Просто сейчас пишу интерфейс для доступа к ораклу из ранее созданной cms.

PHP:
function insertObject($object,$table) {
	$clobs_n = "";
	$clobs_i = "";
	$sql = "INSERT INTO " . $this->prefix.$table . " (";
	$values = ") VALUES (";
	$dd = $this->getDataDefinition($table);

	foreach (get_object_vars($object) as $var=>$val) {
		$qvar = $this->quote_fname($var);
		$sql .= $qvar . ",";

		if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
			$values .= " EMPTY_CLOB(),";
			$clobs_n .= $qvar .",";
			$clobs_i .= ":".$qvar .",";
		}else {
			$values .= "'".str_replace("'","''",$val)."',";
		}
	}

	if ($clobs_n != "")	$cr = " RETURNING ".substr($clobs_n,0,-1)." INTO " . substr($clobs_i,0,-1);
	else $cr = "";

	$stmt = OCIParse($this->connection, substr($sql,0,-1).substr($values,0,-1) . ")".$cr);
	$this->trace(substr($sql,0,-1).substr($values,0,-1) . ")".$cr);
	foreach (get_object_vars($object) as $var=>$val) {
		if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
			$qvar = $this->quote_fname($var);
			${$qvar} = OCINewDescriptor($this->connection, OCI_D_LOB);
			OCIBindByName($stmt, ":" . $qvar, ${$qvar}, -1, OCI_B_CLOB);
		}
	}

	@OCIExecute($stmt, OCI_DEFAULT);
	foreach (get_object_vars($object) as $var=>$val) {
		if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
			$qvar = $this->quote_fname($var);
			${$qvar}->save($val);
			${$qvar}->free();
		}
	}

	$this->checkError($stmt);
	OCICommit($this->connection);
	OCIFreeStatement($stmt);
	if ($this->in_error == false){
		$sql = "SELECT " . $table ."_ids.currval last_value FROM DUAL";
		$stmt = @$this->ora_query($sql);

		if (is_resource($stmt)) $e = @OCIerror($stmt);
		if (empty($e)) {
			$e = @OCIerror($this->connection);
			if ($e === false) $e = @OCIError();
			if ($e === false){
				while (OCIFetch($stmt)) {
					$last_value = OCIResult($stmt, "LAST_VALUE");
					OCIFreeStatement($stmt);
					return $last_value;
				}
			}
		}
	}
	return 0;
}
 

[SDem]

Новичок
Да слушай, код у тебя и правда страшен. :) Я вообще и сам с ораклом неделю общаюсь- тоже кстати перевожу цмс с мускуля на оракл. Но ты знаешь, инпуты и апдейты у меня заработали сразу.То есть вид у них такой же как и у запросов для mysql. Причём разницы нет, апдейтишь ты clob ил поле какого то другого типа. Вобщем помоему ты слишком заморочился.
 

alxg

Новичок
Все было бы хорошо если бы не ограничение.
Такой запрос у меня не отработает insert into table (clob_fld) values ('ну ооооччччень длинный текст по крайней мере больше 4000 символов'). Oracle 9i.
Хотя если строка короче запрос отрабатывает.
 
Сверху