[Pgsql-ayuda] Fución para insertar en 2 tablas simultaneamente

Ing. Roberto Andrade Fonseca randrade@abl.com.mx
Thu, 6 Jun 2002 22:56:25 -0500 (CDT)


Hola:

On Thu, 6 Jun 2002, Sebastián Villalba wrote:

> 	Perdón por la pregunta quizás por demás básica. En una funci=
ón en sql y
> almacenada, yo necesito hacer lo siguiente: Una tabla "usuarios" con
> clave primaria id_usuario (int2)(nombre_usuario, login y password), otra
> tabla "socios", clave primaria id_socio (int4) y un campo
> id_usuario(int2)(domicilio, telefono, etc. etc. etc.). Entonces yo
> necesito dar de alta un nuevo socio, para eso, primero tengo que agregar
> en 1 al id_usuario en "usuarios", poner el login y passord, y después e=
n
> la tabla "socios" agregar en 1 el id_socio (que es diferente al
> id_usuario porque no todos los usuarios son socios), poner el id_usuario
> que figura en la tabla "usuarios" y llenar el resto de los campos de la
> tabla "socios".

Existe una función en Postgres que te devuelve el valor del entero que definiste como serial, siempre y cuando hayas hecho una inserción que implique la creación de un nuevo valor para esa llave:

Con DBI, se hace de la siguiente mamera, aunque tu interés está en la sentencia sql:

 # Armamos la consulta para inserción.
    # Primero los datos personales
    $sql = "insert into persona 
        (nombre, apellidos, direccion, colonia, ciudad_municipio, cp, id_estado, telefono, fax, email, id_grado, id_institucion) 
        values ('$nombre', '$apellidos', '$direccion', '$colonia', '$ciudad', '$cp', '$id_estado', '$telefono', '$fax', '$email', $id_grado, $id_institucion)";
    #print "$sql<p>";
    # Insertamos
    $rv= $dbh->do($sql);

    # Luego los de dependencia y área
    # Primero recuperamos el id_persona
    $sql = "select currval('persona_id_persona_seq')";
    #print "$sql<p>";
    $sth = $dbh->prepare($sql);
    $rv = $sth->execute;
    ($id_persona) = $sth->fetchrow_array;

    # Lo pasamos como campo oculto
    print hidden('id_persona',$id_persona);
...


Espero que te sirva y te quede claro.


Saludos,

Roberto Andrade Fonseca
randrade@abl.com.mx