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.