Ir al contenido



Foto

Array DML y cursores

oracle array dml cursor

  • Por favor identifícate para responder
No hay respuestas en este tema

#1 Gronfi

Gronfi

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 22 noviembre 2018 - 06:09

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:

 

sql
  1. CREATE OR REPLACE PROCEDURE Tratador (Usuario IN PLS_INTEGER,
  2. Dato IN varchar2,
  3. 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:


delphi
  1. FDStoredProc1.ExecProc;
  2. FDStoredProc1.Open;
  3. FDStoredProc1.First;
  4. while not FDStoredProc1.EOF do
  5. begin
  6. LTmp := FDStoredProc1.Fields[0].AsString;
  7. memo1.Lines.Add(LTmp);
  8. FDStoredProc1.Next;
  9. 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:


delphi
  1. FDConnection1.StartTransaction;
  2. FDStoredProc1.Prepare;
  3. FDStoredProc1.FetchOptions.AutoClose := False;
  4. FDStoredProc1.Params.ArraySize := 5;
  5. for I := 0 to 4 do
  6. begin
  7. FDStoredProc1.Params.ParamByName('Usuario').AsIntegers[I] := I;
  8. FDStoredProc1.Params.ParamByName('Dato').AsStrings[I] := '00002800000000_' + I.ToString;
  9. end;
  10. FDStoredProc1.Execute(5, 0);
  11. 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 


delphi
  1. for I := 0 to 4 do
  2. begin
  3. MiDataSet := FDStoredProc1.Params.ParamByName('DatosSalida').AsDataSets[I] as TFDDataSet;
  4. end;

Y no se me ocurre qué más hacer.

¿Alguien tiene alguna sugerencia?

 


  • 0





Etiquetado también con una o más de estas palabras: oracle, array dml, cursor