Archivo de la etiqueta: ALL_VIEWS

Convertir campo tipo LONG a VARCHAR2 para compatibilizar con Oracle 7

 

 

 

Os pongo en contexto …

Resulta que necesito saber que vistas de un usuario determinado están usando un DBLINK hacia otra Base de datos y el DBLINK está almacenado en una Base de datos Oracle 7.

Para saber las vistas necesito consultar la vista all_views cuyo campo text me indica el nombre y contenido del DBLINK. Por tanto, necesito realizar una consulta de esa vista y campo y buscar el texto “@nombre_DBLINK”.

¿ Que sucede ?

Basicamente que el campo text de la vista all_views es de tipo LONG y por tanto, el realizar una búsqueda de una cadena determinada dentro de ese campo, usando por ejemplo “like” no funciona, nos dará el error “ORA-00932: tipos de dato inconsistentes. Pues para que funcionase debería ser de tipo CHAR o VARCHAR2.

Ejemplo:

select * from all_views
where text like ‘%@NOMBRE_DBLINK%’;
ORA-00932: tipos de dato inconsistentes

La solución pasa por convertir el campo text de tipo LONG a VARCHAR2 para poder consultar usando like (patrón de búsqueda).

Para este proceso, crearé una tabla llamada tabla_vistas con los campos que necesito consultar y con un campo tipo VARCHAR2 que será el que usaré para almacenar la información del campo text de la vista all_views y que es de tipo LONG.

CREATE TABLE tabla_vistas (
    propietario VARCHAR2(30),
    nombre_vista VARCHAR2(30),
    texto VARCHAR2(2000) -- En este campo almacenaré la información del campo text de all_views
    );

Una vez creada la tabla, cuyos tipos de datos en los campos coinciden con los que necesito de all_views excepto el campo “texto” que contendrá los datos sacados del campo “text” de tipo LONG, crearé un cursor de tipo explícito (que son los que usamos cuando una consulta devuelve más de una fila) que recorra la vista all_views y extraiga la información fila a fila y a su vez almacene cada fila en la nueva tabla creada, pero convirtiendo el campo text de all_views de LONG a VARCHAR2 para posteriormente, yo poder realizar una consulta sobre la tabla resultado usando la opción “like” para buscar una cadena determinada.

Esto se hace de la siguiente manera:

set serveroutput on size 320000
DECLARE
          CURSOR c1 IS
          SELECT owner,view_name, text FROM all_views;
          c_owner VARCHAR2(30);
          c_view_name VARCHAR2(30);
          c_text LONG;
          cadena2000 varchar2(2000);
    BEGIN
       OPEN c1;
      LOOP
          FETCH c1 INTO c_owner,c_view_name,c_text;
          cadena2000 := substr(c_text,1,2000);
          INSERT INTO tabla_vistas (propietario,nombre_vista,texto) VALUES (c_owner,c_view_name,cadena2000);
          EXIT WHEN c1%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE('No se han encontrado datos.');
       ENDLOOP;
       CLOSE c1;
    END;

Ahora ya podemos realizar la consulta sobre la tabla “tabla_vistas” que contendrá todas las filas de all_views con los campos que necesitábamos y con el campo “text” de tipo LONG convertido a tipo VARCHAR2 en el campo “texto” del ejemplo.

select * from tabla_vistas

where texto like '%@NOMBRE_DBLINK%'; -- Texto a buscar en la tabla resultados