PDA

Ver la Versión Completa : TStoredProcedure y Oracle CLOBs


Tino
11-10-2004, 21:12:42
Hola. A ver si alguién se ha encontrado en la misma situación que yo y sabe darme algún consejo. Tengo una función PLSQL en el server que retorna un CLOB construido dinámicamente. Esta función es llamada por mi programita en delphi, mediante un TStoredProcedure. Va todo perfecto, salvo que no consigo que me retorne el CLOB. El código es:



function TDM.InstanciarDocumento(aParams: String; var aXML, Msg: String): Boolean;
// SPInstanciaXML es un TStoredProcedure
begin
with SPInstanciaXML do
try
ParamByName('P_PARAM_XML').AsString := aParams;
ExecProc();
Result := ParamByName('RESULT').AsBoolean;
if Result then
aXML := ParamByName('P_DOC_XML').AsBlob
else
Msg := ParamByName('P_ERROR').AsString;
finally
Close;
end;
end;




La funcion SQL la tengo definida así:


FUNCTION Fu_Instancia_XML(
p_param_xml IN VARCHAR2,
p_doc_xml OUT NOCOPY CLOB,
p_error OUT VARCHAR2) RETURN BOOLEAN;



La función plsql anterior me va de maravilla... si la ejecuto en un entorno plsql, pero desde Delphi no consigo hacer que funcione.:confused: :confused: :confused:

De hecho, tengo 2 ó 3 funciones por el estilo y ninguna de ellas me funciona. El resto de funciones, que no retornan un CLOB, me van sin problemas.

¿Estoy inicializando mal el TStoredProcedure? Según tengo entendido, un CLOB de Oracle es compatible con el tipo string de Delphi. ¿no es así? :rolleyes:

Uso D7 y Oracle 8i pero también me pasa con la 9i.

Agradecería cualquier comentario.

Tino
21-10-2004, 20:36:04
¿Es posible ejecutar un bloque PLSQL en Delphi? No me refiero a llamar a un proc. almacenado sino a ejecutar un bloque anónimo plsql en Delphi. Supongo que es posible, pero ¿se puede hacer que se retorne un resultado al Cliente?

Tengo un plsql que realiza lo que necesito (pregunta anterior) que me funciona bien. Visualizo el CLOB retornada por la función mediante dbms_output. Si existierá alguna manera de retornar el CLOB a mi programa en delphi sería fantástico.

Agradecería cualquier comentario.

Tino
21-10-2004, 20:39:09
Por si sirve de algo, este es el plsql que quisiera "meter" en Delphi:

DECLARE
vXMLParam VARCHAR2(200) :=
'<?xml version="1.0" encoding="iso-8859-1"?>' ||
'<parametros>' ||
'<PARAMNIF>394002</PARAMNIF>' ||
'</parametros>';
cDoc CLOB;
err VARCHAR2(2000);
vId NUMBER;
BEGIN

SELECT campo3 INTO vId
FROM tabla
WHERE campo1 = 'PRUEBA' AND campo2='PRUEBA';

dbms_LOB.CreateTemporary(cDoc, TRUE);
dbms_LOB.Open(cDoc, dbms_LOB.LOB_READWRITE);
cDoc := Fu_Instancia_XML(vId, vXMLParam);

PrintCLOBOut(cDoc); <== E S T O E S L O Q U E N E C E S I T O

dbms_lob.Close(cDoc);
dbms_lob.freetemporary(cDoc);

END;



Saludos.