Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Oracle (https://www.clubdelphi.com/foros/forumdisplay.php?f=22)
-   -   Como se si el Update se llevo a cabo (https://www.clubdelphi.com/foros/showthread.php?t=32344)

cacuna 02-06-2006 19:42:35

Como se si el Update se llevo a cabo
 
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.

Código SQL [-]
      -- 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

commit;
 
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

Yo hago el Commit desde Delphi
 
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

Me sirve lo del SQLCODE..pero como se aplica
 
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:

Código:

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


La franja horaria es GMT +2. Ahora son las 07:03:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi