Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Oracle
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2021
jofemalo73 jofemalo73 is offline
Registrado
 
Registrado: dic 2021
Posts: 2
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llamar función desde una DLL en Delphi freynoso Varios 2 31-10-2017 14:59:09
Como llamar a una función de BD desde delphi strelok Conexión con bases de datos 3 06-10-2017 11:46:51
Cómo llamar procedimiento almacenado desde delphi con Servidor DataSnap. novato_erick Conexión con bases de datos 2 14-11-2012 18:29:48
Como mandar llamar un procedimiento almacenado desde delphi richy08 MS SQL Server 1 03-02-2010 01:06:23
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 04:05:35


La franja horaria es GMT +2. Ahora son las 07:07:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi