PDA

Ver la Versión Completa : Como se si el Update se llevo a cabo


cacuna
02-06-2006, 19:42:35
Que tal...un saludo.

Pues eso.Utilizo Delphi 7, Oracle 9.
Dentro de un SP llevo a cabo una sentencia UPDATE sobre X tabla, la cual no se esta llevando a cabo -la actualizacion-.

Como puedo saber si mi sentencia Update se ha realizado exitosamente.
Cabe mencionar que lo hago dentro de un Query Dinamico -creo que asi se llama- y verifico, si es que se llevo a cabo el update con un Sql%RowCount, pero al parecer no funciona o no aplica para el Execute Immediate.Ej.

-- Actualiza el Detalle de la Orden de Compra
Execute Immediate ' Update AT_OrdenCompraDet
Set Saldo_OC = Saldo_OC - :vCantidad,
CtaContable_OC = :vCuenta ,
CveProrrateo_OC = :vCveProrrateo
Where OrdenCompra_OC = :vOrdenCompra
and ID_OC =:vID '
Using pCantidad, vCuenta, vCveProrrateo ,vOrdenCompra, vID;

if SQL%RowCount <= 0 then
pMensaje := ' No se pudo actualizar el Saldo de la O.C. !';
raise errError;
end if;

Agradeceria algun comentario o tip.

Saludos,
cacuna.

Paoti
02-06-2006, 20:24:11
Lamentablemente no puedo decirte, como obtener el número de registros modificados,



pero ahi te va un tip:

cuando uses

EXECUTE INMEDIATE

debes de hacer un COMMIT explicito.

es decir:


EXECUTE INMEDIATE <sSentencia>
COMMIT;

Siempre y cuando sSentencia sea, INSERT, UPDATE, DELETE.


te envio un link en ingles, donde viene otra forma de ejecutar sentencias dinámicas, en la cual, te devuelve el número de filas afectadas.

http://www.psoug.org/reference/dbms_sql.html

cacuna
02-06-2006, 21:25:20
Gracias por tu ayuda, pero el COMMIT lo hago desde DELPHI y no en el SP, solo en este caso.

Igualmenmte gracias.

Nota: Me gusto el refran.

Paoti
02-06-2006, 21:31:04
hola cacuna


prueba a hacerlo, con la forma como lo planeta el link....


si fucniona, prque tengo varios procedimientos que te devuelven el número de registros afectado,

está casi al final de la página mencionada arriba

lucasarts_18
02-06-2006, 21:37:52
Hola:

Toda transacción Oracle devuelve el SQLCODE, -1 cuando hay problemas y 0 cuando la operación es exitosa, verifica que los componentes que estás trabajando tiene la propiedad SQLCODE.

Hasta Luego -

Paoti
02-06-2006, 21:44:29
Hola, lucas, esto suena inetresante, y directamente desde ORACLE como se aplica....



para el caso de nuestro compañero cacuna, le inetresa saber las filas afectadas... que creoq eu no es el caso....



sin quitarnos del tema del hilo que se planteo, nos podrias poner un ejemplo del SQL_CODE, que a mi me vendría muy bien


Gracias.


Saludos desde Guadalajara.

cacuna
02-06-2006, 23:12:08
Gracias por sus respuestas.

Como menciona anteriormente, el COMMIT lo hago desde DELPHI pero si revisan el codigo que inserte, la verificacion de si actualizo N registros o no, la hago desde un SP en la BD de Oracle, para asi lanzar una Excepcion-desde el SP-.

Realmente no me interesa cuantos registros se actualizaron, mas bien, si la actualizacion se llevo a cabo o no.

De igual manera aqui no intervienen que componentes que utilizo -ODAC- por que todo es dentro del SP.

Creo que la solucion va por el SQLCODE que menciona Lucas, pero...como se usa?

Mil Gracias de nuevo.

lucasarts_18
03-06-2006, 04:57:55
Hola amigos:

Lamentablemente no trabajo con Delphi - Oracle, pero daré un ejemplo de PowerBuilder, que es el otro ambiente de desarrollo que manejo:

Para saber si una operación tuvo éxito yo aplico:


if SQLCA.SQLCODE = 0 then
go_f.uf_mensaje (1, 'Operación exitosa')
else
go_f.uf_mensaje (3, 'Se ha producido el siguiente error' + string(SQLCA.SQLERRTEXT))
return
end if


Ahora bien esto es PowerBuilder y el Objeto SQLCA es un objeto que representa todo lo que implica la conexión con un determinado motor de base de datos. Sin embargo esto también debe tenerlo delphi (Estoy convencido que lo tiene :) ) a través de algún componente de conexión de base de datos que tenga algún método sobre SQLCODE (este valor es devuelto por oracle) para determinar los estados de las transacciones (Inset - Delete - Update).

Bueno espero que haya servido de guía, básicamente es tomar las variables propias que tiene Oracle ó un determinado motor de base de datos para capturarlo desde un lenguaje de programación, ah !!! casi lo olvidé, en el procedimiento almacenado debe existir una handle exceptión (manejador de excepción) con el fin de levantar dicho error, en caso contrario el error puede pasar totalmente desapercibido ante nuestros ojos :rolleyes: (por lo menos en PowerBuilder me sucede esto)

Hasta la próxima.....:eek:

ramiretor
14-06-2006, 16:57:13
Hola:
¿Necesitas lanzar la sentencia dinamicamente o vas a actualizar la misma tabla siempre?

Saludos