Problema con toba - Postgres

Tengo otro caso que me está desorientando:

En un cuadro pongo un evento que arma una variable $sql compuesta por cuatro sentencias sql:

begin transaction;
update…;
insert…;
end transaction;

Entorno desarrollo :
Cuando lo ejecuto en el entorno de desarrollo, funciona ok.

Entorno Producción:
Al ejecutarlo en el entorno de producción arroja un error que adjunto como imagen.
Si ejecuto el conjunto de sentencias en el pgadmin (copiando lo que toba muestra en el error) se ejecuta ok.
Si ejecuto las sentencias update e insert por separado (desde toba en producción) se ejecutan ok.

No se me ocurre que más puede ser, a lo mejor alguno de uds. me da una pista.

Lo solucioné ejecutándolas separadamente, pero eso pone en peligro la consistencia de la operación.

Saludos


mensaje de error.jpg

mensaje de error.png

Claudio, se me ocurre a mí, que te falta agregarle el punto y coma al final de la primera sentencia UPDATE … ; INSERT …;

Saludos.

Hola Claudio,

te hago una consulta… que metodo estas utilizando para ejecutar estas ordenes?.
La variable $SQL es un string o un arreglo con las sentencias adentro?.

Tene en cuenta que para hacer la apertura y cierre de transaccion existen metodos especificos, se puede hacer tranquilamente por sentencias como haces vos, sin embargo creo que aporta a la claridad del codigo la llamada al metodo, son gustos va :D.

Me llama la atencion que el error menciona las sentencias preparadas, capaz estas usando un metodo de consulta para realizar una ejecucion.

Saludos

Jorozco: Lamentablemente, el punto y coma está.

Richard: Estoy usando el método toba::db()->consultar($sql);

Lo que hay en $sql, es lo que ves en la pantalla de error, salvo por el detalle que toba devuelve con comillas dobles lo que está con comillas simples.

El mismo php, en entorno de desarrollo, funciona a la perfección.

De todos modos, voy a ver el tema como vos lo proponés, con los métodos específicos, ya que tengo, en otro programa que solo se ha ejecutado en entorno desarrollo, un script bastante más grande y complejo, por lo que necesito, si o si, de que funcione en una transacción.

Lo curioso, repito, es que funciona en un equipo y no en el otro.

Hola Claudio,

Aca esta el tema, ese metodo fue diseñado para hacer consultas que recuperen datos, no para ejecutar aquellas que los agregan o modifican.
Para el resto de las SQL’s se deberia usar el metodo toba::db()->ejecutar();

Lo que hay en $sql, es lo que ves en la pantalla de error, salvo por el detalle que toba devuelve con comillas dobles lo que está con comillas simples. El mismo php, en entorno de desarrollo, funciona a la perfección.
Los errores de BD los tira directamente el motor, algunos se capturan para que sean un poco mas claros (PK, FK, campo not null) pero el resto no. Por tanto lo que te debe estar haciendo diferencia es la version del motor de bd.
De todos modos, voy a ver el tema como vos lo proponés, con los métodos específicos, ya que tengo, en otro programa que solo se ha ejecutado en entorno desarrollo, un script bastante más grande y complejo, por lo que necesito, si o si, de que funcione en una transacción.

No hay problema, se puede ejecutar en una transaccion todo completo, fijate que incluso existe el metodo ejecutar_transaccion al que solamente le pasas las SQL.

Saludos

Richard, estimado maestro. Hice lo que me dijiste, me estudié un poquito más la clase toba_db, y usando el método ejecutar_transaccion() funcionó de maravillas.
Desde ya, muchas gracias.

Hay otro método -recuperar_secuencia() - del que me gustaría que me cuentes como trabaja. Lo que suele ser necesario algunas veces es algo que funcione como un comando

“insert into tabla (…) values (…) returning id_registro”

No se si ese método de toba resuelve ese problema.

SAludos

Hola Claudio,

el metodo recuperar_secuencia te devuelve el valor de la secuencia especifica que le pases, siempre y cuando el mismo haya sido seteado dentro de la transaccion.
La idea es usarlo para situaciones en las cuales el registro tiene una clave que se genera automaticamente, entonces obtenes ese valor que luego podes trasladar a otros registros.

Saludos