Convertir de un Varchar en pl/sql que tiene más de 4000 caracteres a un XMLTYPE

Encontré un problema donde necesito convertir una cadena de más de 4000 caracteres a un XMLTYPE. Traté de usar

XMLTYPE.CREATEXML("MY STRING")
XMLTYPE("MY STRING")

En ambos casos, obtuve el error 'String literal too long...'.

preguntado el 25 de noviembre de 13 a las 07:11

2 Respuestas

Podemos pasar solo los datos en formato xml para crear una instancia de XMLTYPE y usar CLOB para pasar el valor de la cadena y luego usar la función EXTRACTVALUE para recuperar los datos.

DECLARE 
str CLOB;
x XMLTYPE;
y CLOB:='<TEXT>MY STRING</TEXT>';
BEGIN
x:= XMLTYPE.CREATEXML(y);
select to_clob(extractvalue(x,'/TEXT')) into str FROM DUAL;
dbms_output.put_line(str);
END;

Por favor revise los enlaces Ejemplos de XMLTYPE y XMLTYPE Documentación para más ejemplos prácticos

respondido 25 nov., 13:10

Si desea seleccionar todo el tipo XML devuelto como Varchar, puede hacer lo siguiente. Aquí estoy seleccionando todo el valor xml.

DECLARE 
str VARCHAR2(4000);
x XMLTYPE;
y CLOB:='<TEXT>MY STRING</TEXT>';
BEGIN
x:= XMLTYPE.CREATEXML(y);
str := x.EXTRACT('/').getstringval();
dbms_output.put_line(str);
END;

SALIDA: <TEXT>MY STRING</TEXT>

También puede profundizar en los nodos secundarios como se muestra a continuación.

DECLARE 
str VARCHAR2(4000);
x XMLTYPE;
y CLOB:='<PARENT><TEXT>MY STRING</TEXT></PARENT>';
BEGIN
x:= XMLTYPE.CREATEXML(y);
str := x.EXTRACT('PARENT/TEXT').getstringval();
dbms_output.put_line(str);
END;

SALIDA: <TEXT>MY STRING</TEXT>

Finalmente, si solo quieres el valor que puedes hacer.

DECLARE 
str VARCHAR2(4000);
x XMLTYPE;
y CLOB:='<PARENT><TEXT>MY STRING</TEXT></PARENT>';
BEGIN
x:= XMLTYPE.CREATEXML(y);
str := x.EXTRACT('PARENT/TEXT/text()').getstringval();
dbms_output.put_line(str);
END;

SALIDA: MY STRING

Respondido el 10 de enero de 18 a las 18:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.