Fuente: Tutorial de informática de TI
Cualquiera que haya utilizado Oracle sabe que Oracle tiene un tipo de datos llamado VARCHAR2, que se utiliza para representar cadenas de longitud variable. VARCHAR2 también es el tipo recomendado por Oracle. Pero hay un problema con el uso de VARCHAR2: solo puede representar un máximo de 4000 caracteres, lo que equivale a 2000 caracteres chinos. Si el valor de un determinado carácter en su programa es superior a 20.002 caracteres chinos, VARCHAR2 no puede cumplir los requisitos. En este momento, tiene dos opciones, una es usar múltiples VARCHAR2 para representarlo y la otra es usar campos LOB. Aquí echamos un vistazo al segundo método.
Primero, echemos un vistazo general a los campos LOB de Oracle. Los tipos LOB de Oracle se dividen en tres tipos: BLOB, CLOB y BFILE. CLOB se llama carácter LOB, BLOB y BFILE se utilizan para almacenar datos binarios. La longitud máxima de CLOB y BLOB es de 4 GB y almacenan valores en la base de datos de Oracle. BFILE es similar a BLOB, pero coloca datos en un archivo externo, por lo que también se le llama BLOB externo (BLOB externo).
Creo que todos estamos familiarizados con MYSQL. Hay tipos de datos similares en MYSQL, como TEXT y BLOB. En la función MYSQL de PHP, las operaciones sobre TEXT/BLOB son directas, al igual que otros tipos de datos. Pero en Oracle la situación es diferente. Oracle trata los LOB como un tipo de datos especial y no puede utilizar métodos convencionales en las operaciones. Por ejemplo, no puede insertar valores directamente en los campos LOB en la instrucción INSERT, ni puede usar LIKE para buscar.
A continuación se muestran algunos ejemplos para ilustrar cómo utilizar la función OCI de PHP para insertar, recuperar y consultar datos LOB.
La inserción
no puede utilizar directamente la instrucción INSERT para insertar valores en los campos LOB. Generalmente, existen los siguientes pasos:
1. Primero analizar una declaración INSERT y devolver un descriptor LOB
2. Usar la función OCI para generar un objeto LOB local
3. Vincular el objeto LOB al descriptor LOB
4. Ejecutar la declaración INSERT
5. Asignar un valor al objeto LOB
6. Libere el objeto LOB y el identificador de la declaración SQL
El siguiente ejemplo almacena el archivo de imagen cargado por el usuario en un BLOB (o BFILE, la operación es ligeramente diferente). Primero, cree una tabla con la siguiente estructura:
CREAR IMÁGENES DE TABLA (
NÚMERO DE IDENTIFICACIÓN,
DESCRIPCIÓN VARCHAR2(100),
MIME VARCHAR2(128),
BOB DE IMAGEN
);
Si desea realizar el aumento automático de ID, cree otra SECUENCIA:
CREATE SEQUENCE PIC_SEQ
y luego el código del programa PHP utilizado para procesar los datos.
<?php
//Establecer una conexión a la base de datos Oracle
$conn = OCILogon($usuario, $contraseña, $SID
//Enviar declaraciones SQL a Oracle
);
//Dos puntos a tener en cuenta aquí: Primero, use la función EMPTY_BLOB(). Esta es una función interna de Oracle que devuelve un localizador LOB. Al insertar un LOB, solo puede utilizar este método para generar primero un localizador de LOB vacío y luego operar en este localizador. La función EMPTY_BLOB() es para el tipo BLOB y la correspondiente a CLOB es EMPTY_CLOB(). La segunda es la parte después de RETURNING, que devuelve la imagen para que la función OCI de PHP pueda manejarla.
$stmt = OCIParse($conn,"INSERTAR EN IMÁGENES (id, descripción, imagen)
VALUES (pic_seq.NEXTVAL, '$description', '$lob_upload_type', EMPTY_BLOB()) RETURNING image INTO :PICTURE");
//Genera un descriptor de un objeto LOB local. Tenga en cuenta el segundo parámetro de la función: OCI_D_LOB, que significa Generar un objeto LOB Otras posibilidades son OCI_D_FILE y OCI_D_ROWID, que corresponden a los objetos BFILE y ROWID respectivamente
$lob = OCINewDescriptor($conn, OCI_D_LOB);
// Vincula el objeto LOB generado al localizador devuelto por la declaración SQL anterior. activado
OCIBindByName($stmt, ':IMAGEN', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
//Guardar datos en el objeto LOB. Dado que los datos de origen aquí son un archivo, utilice directamente el método savefile() del objeto LOB. Otros métodos de objetos LOB incluyen save() y load(), que se utilizan para guardar y recuperar datos respectivamente. Pero el tipo BFILE tiene solo un método, que es save()
if($lob->savefile($lob_upload)){
OCICommit($conexión);
echo "Carga exitosa<br>";
}demás{
echo "Falló la carga<br>";
}
//Libera el objeto LOB
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conexión);
?>
Hay otra cosa a tener en cuenta: el valor del campo LOB debe tener al menos 1 carácter, por lo que antes de guardar() o guardararchivo(), asegúrese de que el valor no pueda estar vacío. De lo contrario, Oracle cometerá un error.
Hay dos formas derecuperar
datos de un LOB. Una es generar un objeto LOB, luego vincularlo al localizador devuelto por una instrucción SELECT y luego usar el método load() del objeto LOB para recuperar los datos. La otra es usar directamente la función OCIFetch*** de PHP. El primer método es mucho más problemático que el segundo método, por lo que hablaré directamente del segundo método.
Todavía use la tabla de arriba.
<?php
$conexión = OCILogon($usuario, $contraseña, $SID);
$stmt = OCIParse($conn,"SELECCIONAR * DE IMÁGENES DONDE ID=$pictureid");
OCIExecute($stmt);
//El secreto se encuentra en el tercer parámetro de PCIFetchInfo: OCI_RETURN_LOBS. El tercer parámetro es el modo FETCH. Si OCI_RETURN_LOBS, el valor LOB se coloca directamente en la matriz de resultados en lugar del localizador LOB, por lo que no se necesita el método load() del objeto LOB.
si (OCIFetchInto($stmt, $resultado, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Tipo de contenido: " StripSlashes($resultado[MIME]);
echo StripSlashes($resultado[IMAGEN]);
}
OCIFreeStatement($stmt);
OCILogoff($conexión);
?>
Este programa se utiliza para mostrar datos (imágenes) colocados en LOB. Método de llamada (suponiendo que el nombre del script sea getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="Imagen colocada en Oracle LOB">
La consulta
se mencionó anteriormente y el campo LOB de Oracle es LIKE no se puede utilizar para hacer coincidir. ¿Qué hacer? De hecho, no es complicado. Oracle tiene un paquete anónimo llamado DBMS_LOB, que contiene todos los procesos necesarios para operar LOB.
Supongamos que tiene una tabla como esta:
CREAR ARTÍCULOS DE TABLA (
NÚMERO DE IDENTIFICACIÓN,
TÍTULO VARCHAR2(100),
CLOB DE CONTENIDO
);
El contenido del artículo se coloca en el campo CONTENIDO.
Ahora queremos encontrar todos los artículos que contengan "usuarios chinos de PHP" en el contenido. Podemos hacerlo así:
<?php.
$conn = OCILogon($usuario, $contraseña, $SID);
//El procedimiento DBMS_LOB.INSTR se utiliza en la cláusula WHERE. Tiene cuatro parámetros. Los dos primeros representan el localizador LOB (puede representarse directamente mediante un campo) y los dos últimos representan el desplazamiento inicial y el número de apariciones. Cabe señalar que se debe juzgar su valor de retorno, es decir, debe ser mayor que 0.
$stmt = OCIParse($conn,"SELECCIONAR * DE ARTÍCULOS DONDE DBMS_LOB.INSTR(CONTENT, 'Usuario chino de PHP', 1, 1) > 0");
OCIExecute($stmt);
si (OCIFetchInto($stmt, $resultado, OCI_ASSOC+OCI_RETURN_LOBS))
{
...
}
OCIFreeStatement($stmt);
OCILogoff($conexión);
?>
Oracle también proporciona muchos procedimientos para operar datos LOB, como LENGTH, SUBSTR, etc. En cuanto a su uso detallado, puede considerar el manual de desarrollo de Oracle.
Se trata de operaciones con datos de tipo LOB en la base de datos Oracle. Como no he estado en contacto con Oracle durante mucho tiempo, puede haber errores en este artículo. Todos pueden criticarme y corregirme.