A veces necesitas hacer uso de las estructuras de plpgsql, por ejemplo, en scripts .sql que llamas desde tareas del cron, etc. Para ello tenemos los bloques DO.
A continuación un bloque sencillo, que comprueba si es primeros de mes y añade un mes de antigüedad a los usuarios registrados. Como puedes ver podemos utilizar variables y ejecutar comandos de los cuales no necesito conocer el resultado (perform).
do $$
declare
dia integer;
begin
select extract ('day' from current_date) into dia from editorial;
if dia = 1 then
perform 'update usuario set months=months+1';
else
raise notice 'Hoy no es día 1';
end if;
end$$;
Intentando arrojar un poco de luz a problemas que puedes encontrarte. Especialmente con PostgreSql
lunes, 6 de octubre de 2014
martes, 12 de agosto de 2014
Cambiar atributos default o not null a una columna existente
Si quieres quitar la propiedad default o not null a una columna existente;
alter table alter column drop not null;
alter table alter column drop default;
Por el contrario, si quieres añadir el atributo not null o la propiedad default:
alter table alter column set not null;
alter table alter column set default current_timestamp;
alter table
alter table
Por el contrario, si quieres añadir el atributo not null o la propiedad default:
alter table
alter table
Ultimo id insertado
Cuando queremos recuperar el último id insertado en una tabla, para por ejemplo asignarlo en los registros de sus hijas. Lo habitual es consultar el último valor de la secuencia asociada al campo clave. Por ejemplo:
select currval('cambio_id_seq');
En este caso tenemos que conocer el nombre de la secuencia, si lo desconociésemos podríamos utilizar la función pg_get_serial_sequence que nos proporcionaría el nombre de la secuencia asociado a un campo determinado de una tabla:
select currval(pg_get_serial_squence('cambio','id'));
Esta opción tiene un problema. Solo nos funcionará si nadie más utiliza dicha secuencia en otra sesión. Es decir en entorno de multiples conexiones no es recomendable.
Por el contrario LASTVAL(), está aislado a nivel de sesión, por lo que no tiene dichos efectos indeseados
Pero si la tabla tuviese un trigger que insertará nuevos registros o modificara la secuencia por algún motivo, LASTVAL() no funcionaría correctamente.
Por todo lo anterior, el mejor método posible es utilizar la clausula RETURNING después de la inserción. Por ejemplo:
insert into cambio (id,usuario1,usuario2)
values (DEFAULT,usuario1_id,usuario2_id)
RETURNING id into cambio_id;
En la variable cambio_id tendremos almacenado seguro el valor de la inserción que estamos haciendo en nuestra sesión, sin efecto colateral alguno.
select currval('cambio_id_seq');
En este caso tenemos que conocer el nombre de la secuencia, si lo desconociésemos podríamos utilizar la función pg_get_serial_sequence que nos proporcionaría el nombre de la secuencia asociado a un campo determinado de una tabla:
select currval(pg_get_serial_squence('cambio','id'));
Esta opción tiene un problema. Solo nos funcionará si nadie más utiliza dicha secuencia en otra sesión. Es decir en entorno de multiples conexiones no es recomendable.
Por el contrario LASTVAL(), está aislado a nivel de sesión, por lo que no tiene dichos efectos indeseados
Pero si la tabla tuviese un trigger que insertará nuevos registros o modificara la secuencia por algún motivo, LASTVAL() no funcionaría correctamente.
Por todo lo anterior, el mejor método posible es utilizar la clausula RETURNING después de la inserción. Por ejemplo:
insert into cambio (id,usuario1,usuario2)
values (DEFAULT,usuario1_id,usuario2_id)
RETURNING id into cambio_id;
En la variable cambio_id tendremos almacenado seguro el valor de la inserción que estamos haciendo en nuestra sesión, sin efecto colateral alguno.
miércoles, 16 de julio de 2014
OpenXava combos
Construyendo administradores backend para una web. Busqué información para la construcción de los típicos combos que facilitan la selección de un valor de una tabla maestra para copiarlo en el campo de una tabla o mostrar su descripción.
Por ejemplo, teniendo una tabla card con varios campos de referencia a otra tabla skill. Y teniendo campos card1,card2 que hacen referencia a la propia tabla la clase quedaría así:
Por ejemplo, teniendo una tabla card con varios campos de referencia a otra tabla skill. Y teniendo campos card1,card2 que hacen referencia a la propia tabla la clase quedaría así:
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import org.openxava.annotations.*;
@Entity
@Table(name = "card", catalog = "soccer", schema = "master")
@View(members=
"Otros datos [#id,name;description;];"+
" [rarity, type, subtype;" +
"price, points, cost, dust;" +
"health, ability, level, collectible;" +
"image, frame, cardset;" +
"skill1; skill2; skill3;" +
"card1Id; card2Id;" +
"classId;" +
"];" +
"cardPackCollection")
import java.util.Collection;
import javax.persistence.*;
import org.openxava.annotations.*;
@Entity
@Table(name = "card", catalog = "soccer", schema = "master")
@View(members=
"Otros datos [#id,name;description;];"+
" [rarity, type, subtype;" +
"price, points, cost, dust;" +
"health, ability, level, collectible;" +
"image, frame, cardset;" +
"skill1; skill2; skill3;" +
"card1Id; card2Id;" +
"classId;" +
"];" +
"cardPackCollection")
public class Card implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@DisplaySize(10)
private Integer id;
@Basic(optional = false)
@Column(name = "name")
@DisplaySize(40)
private String name;
@Basic(optional = false)
@Column(name = "description")
@DisplaySize(120)
private String description;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill1")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill1;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill2")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill2;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill3")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill3;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="card1_id")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Card card1Id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="card2_id")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Integer card2Id;
@OneToMany(mappedBy = "cardId", fetch = FetchType.LAZY)
private Collection cardPackCollection;
public Card() {
}
public Card(Integer id) {
this.id = id;
}
public Card(Integer id, String name, String description, Card card1Id, int card2Id ) {
this.id = id;
this.name = name;
this.description= description;
this.card1Id = card1Id;
this.card2Id = card2Id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@DisplaySize(10)
private Integer id;
@Basic(optional = false)
@Column(name = "name")
@DisplaySize(40)
private String name;
@Basic(optional = false)
@Column(name = "description")
@DisplaySize(120)
private String description;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill1")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill1;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill2")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill2;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="skill3")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Skill skill3;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="card1_id")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Card card1Id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="card2_id")
@DescriptionsList(
descriptionProperties="id,name",
order="name"
)
private Integer card2Id;
@OneToMany(mappedBy = "cardId", fetch = FetchType.LAZY)
private Collection
public Card() {
}
public Card(Integer id) {
this.id = id;
}
public Card(Integer id, String name, String description, Card card1Id, int card2Id ) {
this.id = id;
this.name = name;
this.description= description;
this.card1Id = card1Id;
this.card2Id = card2Id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Skill getSkill1() {
return skill1;
}
public void setSkill1(Skill skill1) {
this.skill1 = skill1;
}
public Skill getSkill2() {
return skill2;
}
public void setSkill2(Skill skill2) {
this.skill2 = skill2;
}
public Skill getSkill3() {
return skill3;
}
public void setSkill3(Skill skill3) {
this.skill3 = skill3;
}
public Card getCard1Id() {
return card1Id;
}
public void setCard1Id(Card card1Id) {
this.card1Id = card1Id;
}
return skill1;
}
public void setSkill1(Skill skill1) {
this.skill1 = skill1;
}
public Skill getSkill2() {
return skill2;
}
public void setSkill2(Skill skill2) {
this.skill2 = skill2;
}
public Skill getSkill3() {
return skill3;
}
public void setSkill3(Skill skill3) {
this.skill3 = skill3;
}
public Card getCard1Id() {
return card1Id;
}
public void setCard1Id(Card card1Id) {
this.card1Id = card1Id;
}
public Integer getCard2Id() {
return card2Id;
}
public void setCard2Id(Integer card2Id) {
this.card2Id = card2Id;
}
public Collection getCardPackCollection() {
return cardPackCollection;
}
public void setCardPackCollection(Collection cardPackCollection) {
this.cardPackCollection = cardPackCollection;
}
}
return card2Id;
}
public void setCard2Id(Integer card2Id) {
this.card2Id = card2Id;
}
public Collection
return cardPackCollection;
}
public void setCardPackCollection(Collection
this.cardPackCollection = cardPackCollection;
}
}
martes, 27 de mayo de 2014
Script migración tablas sueltas
Script de apoyo para mover el contenido una serie de tablas de una base de datos a otra.
Toma el contenido de las tablas tabla1..tabla4 y lo vuelca en /tmp/fichero.dump sin tomar la estructura de la tabla.
Utiliza unas tablas auxiliares para guardar el contenido de las tablas que tienen relaciones con tabla1..tabla4.
Vacía las tablas tabla2_related1..tabla2_related3 con relaciones sobre las tablas que estamos moviendo.
Posteriormente vacía las tablas destino tabla1..tabla4 y despues las rellena con el contenido del fichero /tmp/fichero.dump
Por último restaura el contenido de las tablas con relaciones, utilizando la cópia almacenada en las tablas auxiliares.
Espero que os pueda servir de ayuda en alguna ocasión.
#Volcado de las tablas originales deseadas (primero las maestras luego las dependientes)
pg_dump -U -h -p --inserts --data-only -t tabla1 > /tmp/fichero.dump
pg_dump -U -h -p --inserts --data-only -t tabla2 >> /tmp/fichero.dump
pg_dump -U -h -p --inserts --data-only -t tabla3 >> /tmp/fichero.dump
pg_dump -U -h -p --inserts --data-only -t tabla4 >> /tmp/fichero.dump
#Borrado de las auxiliares
psql -h -U -p -c "drop table schema.aux_tabla2_related1"
psql -h -U -p -c "drop table schema.aux_tabla2_related2"
psql -h -U -p -c "drop table schema.aux_tabla2_related3"
#Relleno de las auxiliares
psql -h -U -p -c "create table schema.aux_tabla2_related1 as select * from schema.tabla2_related1"
psql -h -U -p -c "create table schema.aux_tabla2_related2 as select * from schema.tabla2_related2"
psql -h -U -p -c "create table schema.aux_tabla2_related3 as select * from schema.tabla2_related3"
#Borrado de las relacionadas
psql -h -U -p -c "delete from schema.tabla2_related1"
psql -h -U -p -c "delete from schema.tabla2_related2"
psql -h -U -p -c "delete from schema.tabla2_related3"
#Borramos el contenido de las tablas deseadas
psql -h -U -p -c "delete from schema.dictionary"
psql -h -U -p -c "delete from schema.tabla4"
psql -h -U -p -c "delete from schema.tabla2"
psql -h -U -p -c "delete from schema.tabla1"
#Rellenamos las tablas deseadas
psql -h -U -p < /tmp/fichero.dump
#Restauramos las relacionadas
psql -h -U -p -c "insert into schema.tabla2_related1 select * from schema.aux_tabla2_related1"
psql -h -U -p -c "insert into schema.tabla2_related2 select * from schema.aux_tabla2_related2"
psql -h -U -p -c "insert into schema.tabla2_related3 select * from schema.aux_tabla2_related3"
Toma el contenido de las tablas tabla1..tabla4 y lo vuelca en /tmp/fichero.dump sin tomar la estructura de la tabla.
Utiliza unas tablas auxiliares para guardar el contenido de las tablas que tienen relaciones con tabla1..tabla4.
Vacía las tablas tabla2_related1..tabla2_related3 con relaciones sobre las tablas que estamos moviendo.
Posteriormente vacía las tablas destino tabla1..tabla4 y despues las rellena con el contenido del fichero /tmp/fichero.dump
Por último restaura el contenido de las tablas con relaciones, utilizando la cópia almacenada en las tablas auxiliares.
Espero que os pueda servir de ayuda en alguna ocasión.
#Volcado de las tablas originales deseadas (primero las maestras luego las dependientes)
pg_dump -U
pg_dump -U
pg_dump -U
pg_dump -U
#Borrado de las auxiliares
psql -h
psql -h
psql -h
#Relleno de las auxiliares
psql -h
psql -h
psql -h
#Borrado de las relacionadas
psql -h
psql -h
psql -h
#Borramos el contenido de las tablas deseadas
psql -h
psql -h
psql -h
psql -h
#Rellenamos las tablas deseadas
psql -h
#Restauramos las relacionadas
psql -h
psql -h
psql -h
lunes, 5 de mayo de 2014
Problemas de recepción Wifi Dell XPS 9530
Si estando en modo batería, tenéis problemas de cobertura wifi con vuestro Wifi Dell XPS 9530. Probar a conectaros a la corriente.
Si enchufados los problemas desaparecen, es conveniente que cambiéis el modo en que funciona el adaptador inalámbrico.
En la siguiente ventana, probad con "Ahorro de Energía Bajo", si persisten los problemas cambiar a "Rendimiento máximo".
Si enchufados los problemas desaparecen, es conveniente que cambiéis el modo en que funciona el adaptador inalámbrico.
En la siguiente ventana, probad con "Ahorro de Energía Bajo", si persisten los problemas cambiar a "Rendimiento máximo".
Activar sensor de iluminación en Dell XPS 9530
Para ahorrar batería o para no tener que modificar manualmente el brillo, podemos hacer uso del sensor de iluminación cuya activación está un poco oculta en las opciones de energía del equipo de Windows 8.
Suscribirse a:
Entradas (Atom)

