POSTGRES

Activar postgres en Xampp 1.7.7

Ingresa al directorio donde se instalo el postgresql 9.1, ve hasta la carpeta ‘bin’ y de alli copia los siguientes archivos

– libiconv-2.dll o libiconv.dll
– libintl-8.dll
– libpq.dll
Copiar al directorio ‘C:\xampp\apache\bin’
Activar en el php.ini en la linea
;extension=php_pgsql.dll
extension=php_pgsql.dll
quitar el ‘;’ y luego reiniciar el servicio de apache.

Crear y asignar autoincremental a columna campo tipo serial

Cuando necesites crear un campo y quieres abregale un secuencial.

 

CREATE SEQUENCE esquema.tabla_tbl_id_seq;
ALTER TABLE esquema.tabla ADD COLUMN tbl_id integer;
UPDATE esquema.tabla SET tbl_id = NEXTVAL(‘esquema.tabla_tbl_id_seq’);
ALTER TABLE esquema.tabla ALTER COLUMN tbl_id SET NOT NULL;
ALTER TABLE esquema.tabla ALTER COLUMN tbl_id SET DEFAULT nextval(‘esquema.tabla_tbl_id_seq’::regclass);

Crear Tabla con función en Postgres 8.4 y 9.x

Al realizar una funcion que cree autoamticamente una tabla con parametros, me econtre con un error que decia  ERROR:  syntax error at or near “NOT”
LINE 1: CREATE TABLE  IF NOT EXISTS

Esto no funciono en un postgres 8.4 y la funcion que realice era en 9.x asi que realice dos funciones para que funcione en mi servidor de aplicaciones en 8.4

 

8.4 9.1
CREATE OR REPLACE FUNCTION myEsquema.crear_tabla(text, text)
RETURNS void AS
$BODY$
DECLARE
nombre_tabla ALIAS FOR $1;
iniciales ALIAS FOR $2;
i boolean;
BEGIN
EXECUTE ‘SELECT EXISTS ( SELECT *   FROM   pg_catalog.pg_tables  WHERE  schemaname = ”myEsquema”  AND    tablename  = ”’||nombre_tabla||”’ )’ INTO    i;
IF i THEN
ELSE
EXECUTE ‘CREATE TABLE myEsquema.rol_’ || nombre_tabla || ‘(‘
||iniciales ||’_id integer  null,’
||iniciales ||’_cedula character varying(10) not null,’
||iniciales ||’_periodo date default null,’
||iniciales ||’_orden int null,’
||iniciales ||’_estado int default 2,’
||iniciales ||’_reg_fecha timestamp without time zone DEFAULT now(),’
||iniciales ||’_reg_usu integer) ‘;
END IF;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION myEsquema.crear_tabla(text, text)
OWNER TO postgres;

CREATE OR REPLACE FUNCTION myEsquema.crear_tabla(text, text)
RETURNS void AS
$BODY$
DECLARE
nombre_tabla ALIAS FOR $1;
iniciales ALIAS FOR $2;

BEGIN
execute ‘CREATE TABLE  IF NOT EXISTS myEsquema.rol_’ || nombre_tabla || ‘(‘
||iniciales ||’_id integer  null,’
||iniciales ||’_cedula character varying(10) not null,’
||iniciales ||’_periodo date default null,’
||iniciales ||’_orden int null,’
||iniciales ||’_estado int default 2,’
||iniciales ||’_reg_fecha timestamp without time zone DEFAULT now(),’
||iniciales ||’_reg_usu integer)’;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION myEsquema.crear_tabla(text, text)
OWNER TO postgres;

 

 

 

Particionar tabla postgres, y llenar automaticamente con registros

El siguiente script es para crear una tabla fragmentada horizontalmente y llenar automaticamente con un procedimiento almacenado.

–Postgres
create table tablanormal(llave bigint primary key, dato varchar(15));
create table tablaparticionada(llave bigint primary key, dato varchar(15));

–crea tablas hijas
create table tablaparticionada1(check (llave>=0 and llave<100000))inherits(tablaparticionada);
create table tablaparticionada2(check (llave>=100000 and llave<200000))inherits( tablaparticionada );
create table tablaparticionada3(check (llave>=200000 and llave<300000))inherits( tablaparticionada );
create table tablaparticionada4(check (llave>=300000 and llave<400000))inherits( tablaparticionada );
create table tablaparticionada5(check (llave>=400000 and llave<500000))inherits( tablaparticionada );
create table tablaparticionada6(check (llave>=500000 and llave<600000))inherits( tablaparticionada );
create table tablaparticionada7(check (llave>=600000 and llave<700000))inherits( tablaparticionada );
create table tablaparticionada8(check (llave>=700000 and llave<800000))inherits( tablaparticionada );
create table tablaparticionada9(check (llave>=800000 and llave<900000))inherits( tablaparticionada );
create table tablaparticionada10(check (llave>=900000 and llave<1000000))inherits( tablaparticionada );
create table tablaparticionada11(check (llave>=1000000 and llave<2000000))inherits( tablaparticionada );
create table tablaparticionada12(check (llave>=2000000 and llave<3000000))inherits( tablaparticionada );
create table tablaparticionada13(check (llave>=3000000 and llave<4000000))inherits( tablaparticionada );
create table tablaparticionada14(check (llave>=4000000 and llave<5000000))inherits( tablaparticionada );
create table tablaparticionada15(check (llave>=5000000 and llave<6000001))inherits( tablaparticionada );

–crear reglas
create or replace rule rtablaparticionada1 as
on insert to  tablaparticionada  where (llave >0 and llave<100000) do instead insert into tablaparticionada1 values(new.llave,new.dato);

create or replace rule rtablaparticionada2 as
on insert to  tablaparticionada  where (llave >=100000 and llave<200000) do instead insert into tablaparticionada2 values(new.llave,new.dato);

create or replace rule rtablaparticionada3 as
on insert to  tablaparticionada  where (llave >=200000 and llave<300000) do instead insert into tablaparticionada3 values(new.llave,new.dato);

create or replace rule rtablaparticionada4 as
on insert to  tablaparticionada  where (llave >=300000 and llave<400000) do instead insert into tablaparticionada4 values(new.llave,new.dato);

create or replace rule rtablaparticionada5 as
on insert to  tablaparticionada  where (llave >=400000 and llave<500000) do instead insert into tablaparticionada5 values(new.llave,new.dato);

create or replace rule rtablaparticionada6 as
on insert to  tablaparticionada  where (llave >=500000 and llave<600000) do instead insert into tablaparticionada6 values(new.llave,new.dato);

create or replace rule rtablaparticionada7 as
on insert to  tablaparticionada  where (llave >=600000 and llave<700000) do instead insert into tablaparticionada7 values(new.llave,new.dato);

create or replace rule rtablaparticionada8 as
on insert to  tablaparticionada  where (llave >=700000 and llave<800000) do instead insert into tablaparticionada8 values(new.llave,new.dato);

create or replace rule rtablaparticionada9 as
on insert to  tablaparticionada  where (llave >=800000 and llave<900000) do instead insert into tablaparticionada9 values(new.llave,new.dato);

create or replace rule rtablaparticionada10 as
on insert to  tablaparticionada  where (llave >=900000 and llave<1000000) do instead insert into tablaparticionada10 values(new.llave,new.dato);

create or replace rule rtablaparticionada11 as
on insert to  tablaparticionada  where (llave >=1000000 and llave<2000000) do instead insert into tablaparticionada11 values(new.llave,new.dato);

create or replace rule rtablaparticionada12 as
on insert to  tablaparticionada  where (llave >=2000000 and llave<3000000) do instead insert into tablaparticionada12 values(new.llave,new.dato);

create or replace rule rtablaparticionada13 as
on insert to  tablaparticionada  where (llave >=3000000 and llave<4000000) do instead insert into tablaparticionada13 values(new.llave,new.dato);

create or replace rule rtablaparticionada14 as
on insert to  tablaparticionada  where (llave >=4000000 and llave<5000000) do instead insert into tablaparticionada14 values(new.llave,new.dato);

create or replace rule rtablaparticionada15 as
on insert to  tablaparticionada  where (llave >=5000000 and llave<6000001) do instead insert into tablaparticionada15 values(new.llave,new.dato);

—–para actualizar

create or replace rule ruptablaparticionada1 as
on update to  tablaparticionada  where (old.llave >=0 and old.llave<100000) do instead update   tablaparticionada1  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada2 as
on update to  tablaparticionada  where (old.llave >=100000 and old.llave<200000) do instead update   tablaparticionada2  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada3 as
on update to  tablaparticionada  where (old.llave >=200000 and old.llave<300000) do instead update   tablaparticionada3  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada4 as
on update to  tablaparticionada  where (old.llave >=300000 and old.llave<400000) do instead update   tablaparticionada4  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada5 as
on update to  tablaparticionada  where (old.llave >=400000 and old.llave<500000) do instead update   tablaparticionada5  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada6 as
on update to  tablaparticionada  where (old.llave >=500000 and old.llave<600000) do instead update   tablaparticionada6  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada7 as
on update to  tablaparticionada  where (old.llave >=600000 and old.llave<700000) do instead update   tablaparticionada7  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada8 as
on update to  tablaparticionada  where (old.llave >=700000 and old.llave<800000) do instead update   tablaparticionada8  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada9 as
on update to  tablaparticionada  where (old.llave >=800000 and old.llave<900000) do instead update   tablaparticionada9  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada10 as
on update to  tablaparticionada  where (old.llave >=900000 and old.llave<1000000) do instead update   tablaparticionada10  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada11 as
on update to  tablaparticionada  where (old.llave >=1000000 and old.llave<2000000) do instead update   tablaparticionada11  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada12 as
on update to  tablaparticionada  where (old.llave >=2000000 and old.llave<3000000) do instead update   tablaparticionada12  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada13 as
on update to  tablaparticionada  where (old.llave >=3000000 and old.llave<4000000) do instead update   tablaparticionada13  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada14 as
on update to  tablaparticionada  where (old.llave >=4000000 and old.llave<5000000) do instead update   tablaparticionada14  set dato= new.dato where old.llave=llave;

create or replace rule ruptablaparticionada15 as
on update to  tablaparticionada  where (old.llave >=5000000 and old.llave<6000001) do instead update   tablaparticionada15  set dato= new.dato where old.llave=llave;

CREATE OR REPLACE FUNCTION insertatablanormal(v bigint)
RETURNS void AS
$body$
DECLARE
i bigint;
BEGIN
for i in 1..v loop
insert into tablanormal values (i, ‘1234567890abcd’);
end loop;
END;
$body$
LANGUAGE ‘plpgsql’ VOLATILE;

CREATE OR REPLACE FUNCTION insertatablaparticionada(v bigint)
RETURNS void AS
$body$
DECLARE
i bigint;
BEGIN
for i in 1..v loop
insert into tablaparticionada values (i, ‘1234567890abcd’);
end loop;
END;
$body$
LANGUAGE ‘plpgsql’ VOLATILE;

truncate tablanormal;
truncate tablaparticionada;
select insertatablanormal(1000000);
select insertatablaparticionada(1000000);
SELECT * FROM tablanormal ;
SELECT * FROM tablaparticionada;
UPDATE tablanormal SET dato = ’00ABCDEFGHI123′;
UPDATE tablaparticionada SET dato = ‘AAABCDEFG12345’;
DELETE FROM tablanormal;
DELETE FROM tablaparticionada;

Continue reading

CLAVES DE POSTGRES ORIGINAL

Para saber la clave de postgres original funciona asi
–clave original de un usuario postgres
select md5(‘clavespostgres’);