Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wolfphw

PHP + ORACLE campo CLOB - FAIL :(

Recommended Posts

E ae povo,

 

já estou faz 4 dias batendo cabeça, testando tudo oke tem na net mas nada..

 

Estou com um problema, to fazendo um BLOG em PHP com banco ORACLE, estou utilizando o oracle 11g, o campo CLOB cabe 4.000 caracteres, dai acima disso tem que transformar pra binario, e ai está o problema, estou tentando de tudo para pode fazer isso, estou utilizando o PDO. fiz procedures tb e nada.. se alguem puder me ajudar agradeço....

 

 

Segue minha estrutura de teste no banco

 

tabela TESTE

 

ID (number) TEXTO (clob)

1 texto exemplo 01

2 texto exemplo 02

3 texto exemplo 03

 

 

PROCEDURE

CREATE OR REPLACE PROCEDURE TESTE_UPDATE 
(
  ID_ENTRADA IN NUMBER 
, TEXTO_ENTRADA IN CLOB 
) AS 
BEGIN
  UPDATE TESTE SET TEXTO=TEXTO_ENTRADA WHERE ID=ID_ENTRADA;
END TESTE_UPDATE;

PHP CHAMANDO A PROCEDURE pra UPDATE no campo

<?php
require("conexao.php");

$id = 1;
$texto = "123456789 ";
for ($i=0; $i<=100; $i++) {
     $texto .= "123456789 ";
}


$stmt = $pdo->prepare("CALL TESTE_UPDATE(?,?)");

$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->bindParam(2, $texto, PDO::PARAM_LOB);

$pdo->beginTransaction();
$stmt->execute();
$pdo->commit();

?>

Dessa forma ele não vai tb, agora se eu retirar o PDO::PARAM_LOB ele altera o campo, desde que a quantidade de caracteres não seja superior a 4.000, esse PDO::PARAM_LOB seria para converter para o formato do campo CLOB do oracle...

 

 

PHP inserindo no banco

<?php
require("conexao.php");
	
$id = 10;
$texto = "123456789 ";
for ($i=0; $i<=100; $i++) {
    $texto .= "123456789 ";
}


$stmt = $pdo->prepare("insert into TESTE (ID, TEXTO) values (?,?)");

$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->bindParam(2, $texto, PDO::PARAM_LOB);

$pdo->beginTransaction();
$stmt->execute();
$pdo->commit();
?>

Mesma coisa se eu tirar o PDO::PARAM_LOB ele tb insere desde que não ultrapasse os 4.000 caracteres.

 

Esse FOR vai servir para criar a string com uma quantidade grande, nos exemplos esta 100x, então vai ser uma string com um pouco mais de 1.000 caracteres, se mudar o valor pra <= 1000 ele já vai passar de 10.000 caracteres e já não altera e nem insere no banco, mesmo com o PDO::PARAM_LOB ou sem ele.

 

Alguém já passou por isso???

 

Ou teria uma outra dica de como colocar um conteúdo em um campo do ORACLE com mais de 20.000 caracteres????

 

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites
Consegui resolver, utilizando a procedure mesmo, mas com uma alteração da que estava escrevendo e utilizando outro método para executar a procedure


TABELA EXEMPLO

TB_TESTE

ID (number) TEXTO (clob)

1 Texto exemplo 01

2 Texto exemplo 02



PROCEDURE



CREATE OR REPLACE PROCEDURE TESTE_UPDATE
(
ID_ENTRADA IN NUMBER
, TEXTO_ENTRADA IN CLOB
) AS
BEGIN
UPDATE TB_TESTE SET TEXTO=TEXTO_ENTRADA WHERE ID=ID_ENTRADA;
END TESTE_UPDATE;



EXECUTANDO A PROCEDURE VIA PHP



<?php
require("conexao.php");

$string = "";
for ($i=1;$i<=3200;$i++) {
$string .= "123456789-";
}

$sql = "BEGIN
TESTE_UPDATE('1','$string');
END;";

$pdo->query($sql);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa ressuscitar esse tópico, mas nao entendi sua resolução.

Estou com quase o mesmo caso, mas no meu é acessar o campo de long obj. 

Quando tento acessar via PDO segue esse erro: data was too large for buffer and was truncated to fit it in.

Sabe como posso resolver para ler esses dados?

O Campo é do tipo LONG no banco de dados ORACLE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.