Hola,
intentando optimizar (como no), tengo una aplicación que hace una llamada a Oracle a través de un procedimiento almacenado. Este procedimiento tiene básicamente como parámetros los siguientes:
CREATE OR REPLACE PROCEDURE Tratador (Usuario IN PLS_INTEGER, Dato IN varchar2, DatosSalida IN OUT SYS_REFCURSOR)
En el código de Delphi, se espera por tanto como salida un cursor, que se recorre tratando al propio procedimiento almacenado como si fuera un dataset:
FDStoredProc1.ExecProc; FDStoredProc1.Open; FDStoredProc1.First; while not FDStoredProc1.EOF do begin LTmp := FDStoredProc1.Fields[0].AsString; memo1.Lines.Add(LTmp); FDStoredProc1.Next; end;
En el ejemplo se escribe en un memo lo que se recibe de Oracle, que en mi caso es una tabla de una columna de tipo varchar de un cierto tamaño.
Ahora viene la optimización, pasar a array dml. El problema no viene a la hora de rellenar los campos y ejecutar, sino a la hora de extraer los datos, pues tienen que venir de vuelta (digo lo que parece la teoría) un array del mismo tamaño de cursores, pero no sé como hacerlo. Si lo hago como antes, solo veo los resultados del primer procedimiento que se ejecuta, pero no sé como obtener los demás datos.
Pongo a continuación el código:
FDConnection1.StartTransaction; FDStoredProc1.Prepare; FDStoredProc1.FetchOptions.AutoClose := False; FDStoredProc1.Params.ArraySize := 5; for I := 0 to 4 do begin FDStoredProc1.Params.ParamByName('Usuario').AsIntegers[I] := I; FDStoredProc1.Params.ParamByName('Dato').AsStrings[I] := '00002800000000_' + I.ToString; end; FDStoredProc1.Execute(5, 0); FDConnection1.Commit;
Intentos de obtener los datos:
1) Como antes, solo obtengo los datos del cursor del primer procedimiento ejecutado
2) Intento 2, recorrer los parámetros de salida, pero no tengo claro como usarlos o a que hacer un casting. No funciona, MiDataSet es siempre nil
for I := 0 to 4 do begin MiDataSet := FDStoredProc1.Params.ParamByName('DatosSalida').AsDataSets[I] as TFDDataSet; end;
Y no se me ocurre qué más hacer.
¿Alguien tiene alguna sugerencia?