Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Simular una función almacenada en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=69668)

santiago14 01-09-2010 05:35:08

Simular una función almacenada en Firebird
 
Buenas, tengo un procedimiento almacenado y estoy intentando hacer lo siguiente:

Código SQL [-]
CREATE PROCEDURE FECHA_HORA_SERVIDOR 
returns (
    fechahora timestamp)
as
begin
  /* Devuelve la fecha y hora del servidor (marca de tiempo)*/
  --select distinct current_time from entorno
  --into :fechahora;
    
  fechahora = current_timestamp;
  suspend;
end
Ahora mi consulta...
Código SQL [-]
Select fecha_hora_servidor From rdb$database

Así como está no funciona el Select, el error me dice:
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
FECHA_HORA_SERVIDOR;

Lo que quisiera es poder lograr que a un procedimiento almacenado lo pueda poner como expresión dentro del Select...
Si no se puede de esta manera, ¿qué otra forma tengo para lograrlo?

Gracias.

RONPABLO 01-09-2010 06:14:10

Tal vez así...

Código SQL [-]

select 
     campo1, 
     campo2, 
     (selectfechahora fromFECHA_HORA_SERVIDOR) as Fecha_hora_servidor
from Tabla where ......

(lo digo de memoria, creo que así esta bien, pero si no es algo similar...)

afxe 01-09-2010 11:09:14

consulta directa
 
Creo que no entiendo tu store procedure, ¿Porque no consultas directamente la fecha?
Código SQL [-]
select current_timestamp from RDB$Database

Saludos.

Casimiro Notevi 01-09-2010 11:13:25

No sé si he entendido bien lo que quieres, pero la sentencia para llamar al procedure sería:

Código SQL [-]
select * from fecha_hora_servidor;

Aunque para extraer la fecha, hora y fechahora del servidor puedes usar:

Código SQL [-]
select CURRENT_DATE from RDB$DATABASE;
select CURRENT_TIME from RDB$DATABASE;
select CURRENT_TIMESTAMP from RDB$DATABASE;


Edito: No había visto lo que ha dicho afxe :)

santiago14 01-09-2010 13:44:52

Lo de la fecha fue solo un ejemplo, lo que quiero es poner un "procedimiento almacenado" que devuelva, por ejemplo, un valor numérico secuencial. En este momento se piensa en un Generador pero resulta que no están dentro de la transacción y yo necesito que si estén.
La única forma que hallé es "simular" un generador a través de un procedimiento almacenado, el cual si está dentro de una transacción y me asegura que no voy a tener agujeros dentro de la numeración.
Pero bueno, ahora la cosa está un poco mas complicada y sería bueno poder llamar a esos "generadores" de números como si fueran campos del Select.

No se si me expliqué mejor.

Gracias.

santiago14 01-09-2010 14:02:00

Cita:

Empezado por RONPABLO (Mensaje 375172)
Tal vez así...

Código SQL [-]

select 
     campo1, 
     campo2, 
     (selectfechahora fromFECHA_HORA_SERVIDOR) as Fecha_hora_servidor
from Tabla where ......

(lo digo de memoria, creo que así esta bien, pero si no es algo similar...)

Bueno, gracias RONPABLO, con tu ayuda pude llegar a esto:
Código SQL [-]
Insert into familias (cod_familia, fecha_ingreso_familia, estado_familia)
Select (select nc.nro from nuevo_codigo(5) nc), (select fhs.fechahora from fecha_hora_servidor fhs),
  'ACTIVO'  From rdb$database
union all
Select (select nc.nro from nuevo_codigo(5) nc) , (select fhs.fechahora from fecha_hora_servidor fhs),
  'ACTIVO'  From rdb$database

En el caso de la Fecha si es superfluo el asunto del procedimiento almacenado, pero en el caso de "nuevo_codigo" no, puesto que este me devuelve un valor y además se encarga de aumentar en 1 la secuencia para que el siguiente select se encuentre con un valor correlativo.
Intenté poner en lugar de (select nc.nro from nuevo_codigo(5) nc) la expresión gen_id(ibe$log_tables_gen, 1), un generador común y me envió el siguiente error:
Invalid insert or update value(s): object columns are
constrained - no 2 table rows can have duplicate column values.
violation of PRIMARY or UNIQUE KEY constraint "PK_FAMILIAS" on table "FAMILIAS".

En principio la cosa está mejor, tal vez haya una mejor manera de hacer lo que necesito.

Gracias.


La franja horaria es GMT +2. Ahora son las 16:04:11.

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