Ver Mensaje Individual
  #1  
Antiguo 14-12-2021
jofemalo73 jofemalo73 is offline
Registrado
 
Registrado: dic 2021
Posts: 2
Reputación: 0
jofemalo73 Va por buen camino
Llamar a una función/procedimiento de BBDD desde Delphi

Buenas,

Al final me he decidido por este hilo, espero no haberme equivocado.

- Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
- Delphi Versión 7 (Build 4.453)

Tengo un paquete de base de datos donde he definido varias funciones, las funciones devuelven un tipo personalizado.
Este tipo personalizado se encuentra en la sección de la especificación del paquete de Oracle.

Código SQL [-]
  -- Estructura Operación
  TYPE TOperacion IS RECORD 
      (operacion_id        acceso.via_operacion.ope_id%TYPE,                       -- Identificador de la Operación.
       operacion_desc      acceso.via_operacion.ope_descripcion%TYPE,              -- Descripción de la Operación.
       valor               acceso.via_valor.val_id%TYPE);                          -- Valor de la Operación (0:Sin permiso - 1:Con permiso).

  TYPE TaTOperacion IS TABLE OF TOperacion INDEX BY PLS_INTEGER;
  

  -- Estructura Criterio
  TYPE TCriterio IS RECORD 
      (criterio_id         acceso.via_criterio.cri_id%TYPE,                        -- Identificador del Criterio.
       criterio_desc       acceso.via_criterio.cri_descripcion%TYPE,               -- Descripción del Criterio.
       operacion           TaTOperacion);                                          -- Lista de operaciones asociadas al Criterio.       

  TYPE TaTCriterio IS TABLE OF TCriterio INDEX BY PLS_INTEGER;
  
  
  -- Estructura Permisos
  TYPE TPermisos IS RECORD 
      (usuario             acceso.usuarios.nusuario%TYPE,                          -- Identificador del usuario.
       usuario_desc        acceso.usuarios.desusu%TYPE,                            -- Nombre del usuario.
       servicio_id         acceso.area.area%TYPE,                                  -- Identificador del Servicio.
       servicio_desc       acceso.area.texto%TYPE,                                 -- Descripción del Servicio.
       puesto_id           acceso.rh_puestos_trabajo.ptr_puesto%TYPE,                -- Identificador del Puesto.
       puesto_desc         acceso.rh_puestos_trabajo.ptr_descripcion%TYPE,           -- Descripción del Puesto.
       criterio            TaTCriterio);                                           -- Lista de criterios.


Existe una función que devuelve un tipo TPermisos, debido al fracaso (que ahora comentaré), convertí esta función en un procedimiento donde uno de los parametros fuera de salida y del tipo TPermisos.

Desde Delphi he intentado llamar a la función y al procedimiento, sin exito.

He usado el componente TOraStoredProc (este es un ejemplo pero he hecho varias pruebas distintas):

Código SQL [-]
  OraStoredProc1.StoredProcName := 'ACCESO.PCK_VISIBILIDAD_ACCESO.PRC_PERMISO';   // FNC_PERMISO
  OraStoredProc1.Params.CreateParam(ftInteger, 'pi_usuario', ptinput);
  OraStoredProc1.Params.CreateParam(ftADT, 'po_permiso', ptoutput);  // ftUnknown  // ftReference // ftArray // ftTypedBinary // ftCursor // ftVariant
  OraStoredProc1.Prepare;
  OraStoredProc1.ParamByName('pi_usuario').Value := 322;
  OraStoredProc1.Execute;

¿Cual es el problema?
En el primer parámetro de CreateParam se define el tipo del parámetro, y el tipo viene definido por TFieldType.

Código SQL [-]
  TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
    ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
    ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
    ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,
    ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob,
    ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);

No consigo encontrar la forma de encontrar un tipo que se trague la estructura que he definido en la especificación del paquete de Oracle.
"El error que da es que el número de argumentos o tipo es erroneo".
El número de argumentos no es, hay dos parámetros, uno de entrada y otro de salida, el tipo del primero es ftInteger, y el tipo del segundo ... he probado con varios tipos y nada.

No sé si se os ocurre como hacerlo o si lo hariais de otra manera.

Espero haberme explicado, si no ha quedado claro preguntarme que intentaré ser más claro.

Gracias de antemano.
Responder Con Cita