Cadena literal de Oracle demasiado larga: extracción de datos dentro de una cadena
Frecuentes
Visto 1,012 equipos
1
Usando Oracle 11g, tengo la siguiente cadena LDAP que es solo un subconjunto de lo que estoy tratando de demostrar aquí.
Básicamente, tengo una cadena muy larga que me está causando problemas de 'cadena literal demasiado larga' y, básicamente, dentro de esta cadena, quiero poder eliminar las partes que no quiero o, mejor aún, eliminar las únicas partes que Necesito.
Esta es solo una versión corta del contenido/longitud de la cadena:
Miembro de = CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall -Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=ea90045052, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN =DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=D0902498 , CN=ea90045052, CN=aTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall -Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=ea90045052, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN =DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall -Administrador, CN=DAaTIGERCall-Administrador, CN=aTIGERCall-Administrador,
Suponga que lo anterior tiene más de 4000 caracteres.
Mi problema es que, al usar Oracle SQL y PL/SQL y la cadena "miembro de" anterior, de alguna manera necesito filtrar solo los bits que se ven como 'CN=aTIGER%' e ignorar por completo las entradas que se ven como 'CN=DAaTIGER% ' que creo, resolvemos mis problemas de literales de cadena, pero no puedo filtrar esto primero porque mi cadena original ya tiene más de 4000 caracteres.
Usando pl/sql, estoy buscando un enfoque que solo devuelva las entradas dentro de "miembro de" que se ven como 'CN = aTIGER%' e ignore por completo las entradas que se ven como 'CN = DAaTIGER%' al mismo tiempo, asegúrese de que también hay una coma al final del resultado.
¿Necesito asignar esto a un CLOB y luego procesar las entradas que necesito?
1 Respuestas
2
En el siguiente código, prellené un CLOB
"c
" con un montón de datos como su muestra. No estoy seguro de lo que quiere hacer con cada entrada de calificación; solo DBMS_OUTPUT
él.
Dado todo eso, aquí hay una puñalada:
SET SERVEROUTPUT ON
DECLARE
c CLOB;
l_offset POSITIVE := 1;
l_ldap_component LONG;
l_counter NATURAL := 0;
BEGIN
-- Set up the CLOB. In real life, this data will come
-- from some other source.
c := 'Member of = CN=aTIGERAdmin-Admin'
|| ', CN=D0902498'
|| ', CN=ea90045052'
|| ', CN=aTIGERCall-Admin'
|| ', CN=DAaTIGERCall-Admin'
--- Lots of additional data excised for the sake of brevity....
|| ', CN=aTIGERCall-Admin,';
DBMS_OUTPUT.PUT_LINE('Length of CLOB = ' || TO_CHAR(DBMS_LOB.GETLENGTH(c)));
-- Search for commas within the CLOB, and extract each subsequent
-- inter-comma string, including the trailing comma.
WHILE (DBMS_LOB.INSTR(c,',',l_offset) > 0)
LOOP
l_ldap_component :=
TRIM (
DBMS_LOB.SUBSTR(c
, DBMS_LOB.INSTR(c
, ','
, l_offset) - l_offset + 1
, l_offset)
);
IF (l_ldap_component LIKE 'CN=aTIGER%,') THEN
-- I'm printing the qualified entries to the screen, but you
-- can add them to a collection or whatever....
DBMS_OUTPUT.PUT_LINE(l_ldap_component);
END IF;
l_offset := DBMS_LOB.INSTR(c,',',l_offset) + 1;
END LOOP;
END;
/
Con los datos que usé, este código produjo el resultado:
Length of CLOB = 5127
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
PL/SQL procedure successfully completed.
SQL>
Espero que esto ayude.
Respondido 03 Jul 12, 04:07
eres una LEYENDA. Gracias por eso, realmente lo aprecio. - tonyf
¿Qué tal entradas como
CN=D0902498
orCN=ea90045052
? - Ωmega¿Por cuánto tiempo el literal está causando el error? ¿Intentaste dividir la cadena en un varray? - Iľja