Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > PostgreSQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-11-2007
elvymena elvymena is offline
Miembro
 
Registrado: sep 2007
Posts: 20
Poder: 0
elvymena Va por buen camino
Como crear una sencuencia automática en Postgres 8.2

Sr.

Me gustaría saber unas cuantas cosas:
La primera: Como yo puedo asignarle secuencia automatica aun campo creado en Postgres, esto lo necesito por que mi programa necesito que sea multiusuario interconectado en Red.

Segundo: Es cierto que la conexión con ADO es lenta? Por que? y como puedo conectar Postgres con Delphi sin utilizar Ado, y cuales son los pasos a seguir con la otra opción de conexión que no sea ADO.

saludos, este foro es lo mejor, lo felicito a todos.

Elvy Mena.
Responder Con Cita
  #2  
Antiguo 19-12-2007
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Bueno, esta respuesta llega como un mes tarde, y supongo que Elvy ya habrá resuelto sus problemas... pero escribo a manera simplemente informativa:

Una secuencia en PostgreSQL se define de la siguiente forma:

1. Creas un objeto tipo sequence
2. Creas una función que retorna un tipo de dato trigger
3. Creas un trigger (before Insert) sobre la tabla en cuestión, que llame a esta función.

Aquí va un ejemplo:

1. Creas un objeto tipo sequence

Código:
CREATE SEQUENCE NombreSequencia
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 14
  CACHE 1;

Bueno la sequencia puedes crearla solo con

Código:
CREATE SEQUENCE NombreSequencia;
Los demás parámetros son opcionales y los encuentras en la ayuda.

2. Creas una función que retorna un tipo de dato trigger

Código:
CREATE OR REPLACE FUNCTION NombreFuncion()
  RETURNS "trigger" AS
$BODY$
    BEGIN
    New.NombreCampoSequencia:=nextval('NombreSequencia');
    Return NEW;
    END;
 $BODY$
  LANGUAGE 'plpgsql' VOLATILE;
3. Creas un trigger (before Insert) sobre la tabla en cuestión, que llame a esta función.

Código:
CREATE TRIGGER NombreTrigger
  BEFORE INSERT
  ON NombreTabla
  FOR EACH ROW
  EXECUTE PROCEDURE NombreFuncion();

Toda la documentación la encuentras en la ayuda de PostgreSQL.


Por otro lado, para Trabajar Delphi y PostgreSQL, te recomiendo los componentes Zeos.


Saludos,
Responder Con Cita
  #3  
Antiguo 26-01-2009
elvymena elvymena is offline
Miembro
 
Registrado: sep 2007
Posts: 20
Poder: 0
elvymena Va por buen camino
Gracias... man, aun estaba necesitando esta informacion.
Responder Con Cita
  #4  
Antiguo 03-02-2009
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Supertarde...

si aún te sirve el dato tambien puedo aprtarte algo.

Al crear la tabla puedes hacer que postgres cree la secuencia por ti...

Código SQL [-]
CREATE TABLE schema.table (
  field_id  SERIAL ...
);

El tipo de dato SERIAL es en realidad un entero que ordena a postgres crear la secuencia, el triger y el default en tu tabla.

así mismo puedes usar un BIGSERIAL que es el equivalente al BIGINT.

----

Las secuencias son efectivas pero tienen un pequeño problema si las usas en el default (comportamiento por defecto al usar SERIAL y BIGSERIAL).

es que cuando intentas hacer un insert y cancelas... la secuencia de todos modos generá un consecutivo. esto es un PROBLEMA para facturas, recibos y consecutivos que no pueden alterarse.

----

Pues no se si es lo más correcto pero tengo esta funcion para obetener el autonumerico...

Código SQL [-]
CREATE OR REPLACE FUNCTION "public"."getnextid" (
  tablename varchar,
  fieldname varchar,
  incvalue NUMERIC
) RETURNS NUMERIC AS
$body$
DECLARE
 rec RECORD;
 var_max NUMERIC;
BEGIN
  FOR rec IN EXECUTE 'Select CAST(max('|| FieldName ||') AS NUMERIC) as maxid from ' || TableName LOOP
   var_max := rec.maxid::NUMERIC;
  END LOOP;
 
  IF var_max IS NULL THEN
   RETURN 1;
  ELSE
   RETURN var_max + IncValue;
  END IF;
 
  RETURN 1;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

y pues así las uso...

Código SQL [-]
CREATE TABLE schema.table (
  field_id  INTEGER ... DEFAULT getnextid('schema.table', 'field_id', 1) ...
);

----

Pues espero que halla sido de tu ayuda.


por cierto con los componentes...

existen varias formas de conectar a postgres desde delphi...

1. ADO (Ya la vistes)
2. ODBC : En la misma página de PostgreSQL se puede descargar el controlador ODBC para postgres... la conexión la terminas haciendo con BDE desde delphi...
3. conexión directa con ZEOS Lib... bueno ZEOS Lib no lo he trabajado pero me dicen que es muy bueno...
4. si tienes presupuesto.... PostgresDAC... se usa casi de la misma forma que usas BDE y tiene un excelente rendimiento.

espero que te ayude en algo... aunque SUPERTARDE.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 19-02-2009
Avatar de Arcioneo
Arcioneo Arcioneo is offline
Miembro
 
Registrado: jul 2006
Ubicación: Tierra
Posts: 583
Poder: 18
Arcioneo Va por buen camino
Mas tarde aun

Pero peudes crearte la secuencia como te indicaron y en lugar del trigger al hacer tus inserts algo como esto

insert into MyTabla(cveIncrementable, desc) values(secuencia.nextVal, 'algo')
__________________
"Porque es tan idiotamente sorda la fé y tan ciego el que cree?".
Responder Con Cita
  #6  
Antiguo 19-02-2009
Avatar de Arcioneo
Arcioneo Arcioneo is offline
Miembro
 
Registrado: jul 2006
Ubicación: Tierra
Posts: 583
Poder: 18
Arcioneo Va por buen camino
No olvides que si trabajas en grandes volumenes

Los triggers(se haga o no tu insert) te merman el tiempo de ejecucion
__________________
"Porque es tan idiotamente sorda la fé y tan ciego el que cree?".
Responder Con Cita
  #7  
Antiguo 26-03-2009
ecch ecch is offline
Miembro
 
Registrado: dic 2007
Posts: 11
Poder: 0
ecch Va por buen camino
Para secuencias estrictas Yo iria por el Trigger

Efectivamente

Si se trata de secuencias estrictas, donde no debe existir saltos, llamase facturas, albaranes, documentos que revisan las dependencias fiscales Apoyo lo indicado por movorack:

Cita:
es que cuando intentas hacer un insert y cancelas... la secuencia de todos modos generá un consecutivo. esto es un PROBLEMA para facturas, recibos y consecutivos que no pueden alterarse.
Si se trata de una secuencia interna, entonces seria mejor la alternativa de Arcioneo con miras a obtener el mejor rendimiento de la base de Datos

Saludos.

Última edición por ecch fecha: 26-03-2009 a las 01:05:35. Razón: ortografia
Responder Con Cita
  #8  
Antiguo 19-11-2009
Avatar de oracle
oracle oracle is offline
Miembro
 
Registrado: feb 2005
Posts: 99
Poder: 20
oracle Va por buen camino
Smile

Para echarle más leños al fuego quisiera añadir que el asunto de las secuencias en postgres me ha dado algunos pequeños problemas cuando trato de hacer en php, especialmente cuando estoy utilizando symfony. En estos casos he tenido que crear las secuencias manualmente porque por alguna razón sólo se ejecutan si tienen el siguiente formato:

Código SQL [-]
CREATE SEQUENCE tablaX_seq;
    ALTER TABLE tablaX
    ALTER id_tablaX SET DEFAULT nextval('tablaX_seq');

Saludos

oracle
__________________
El único hombre que no se equivoca es el que nunca hace nada.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Cómo cerrar conexión? Delphi, Zeos y Postgres mangels PostgreSQL 4 16-11-2007 17:00:59
Como se accesa Postgres ? rubencho PostgreSQL 2 19-07-2007 05:00:57
Como realizar la conexion con Postgres SQL alastor PHP 2 14-08-2006 22:07:18
Crear Matricula Automatica frholguin SQL 6 03-08-2006 22:11:26
Como conectarme a una base de datos como postgres o mysql?? marys MySQL 4 08-05-2003 12:34:08


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


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