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

  • Автор темы Автор темы [SDem]
  • Дата начала Дата начала

[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(); и всё заработало:-)
 
А в ман посмотреть не пробовал?

Есть флаг:
OCI_RETURN_LOBS

[m]oci_fetch_array[/m]
 
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;
}
 
весь этот ужасный код заменяется на одну строку с oci_fetch_array() с флагом, указанным в посте Falc'а.
 
У меня php4.
К тому же весь код одной строкой заменить не получится :)
 
для PHP4 рекомендуется взять http://pecl4win.php.net/ext.php/php_oci8.dll
но даже в PHP4 есть ocifetchinto(), которая заменяет ocifetch(), ociresult() & ocilobload().
 
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;
}
 
Да слушай, код у тебя и правда страшен. :-) Я вообще и сам с ораклом неделю общаюсь- тоже кстати перевожу цмс с мускуля на оракл. Но ты знаешь, инпуты и апдейты у меня заработали сразу.То есть вид у них такой же как и у запросов для mysql. Причём разницы нет, апдейтишь ты clob ил поле какого то другого типа. Вобщем помоему ты слишком заморочился.
 
Все было бы хорошо если бы не ограничение.
Такой запрос у меня не отработает insert into table (clob_fld) values ('ну ооооччччень длинный текст по крайней мере больше 4000 символов'). Oracle 9i.
Хотя если строка короче запрос отрабатывает.
 
Сверху