Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Contar registros en un insert into (https://www.clubdelphi.com/foros/showthread.php?t=89049)

jars 17-09-2015 16:59:10

Contar registros en un insert into
 
Hola amigos.
Hay alguna forma de saber cuantos registros se importaron utilizando:
Código SQL [-]
INSERT INTO TABLA2 SELECT * FROM TABLA1 WHERE....
y lo mismo para cuando es un DELETE FROM ....

Gracias

Casimiro Notevi 17-09-2015 17:06:32

¿BD? :rolleyes:

jars 17-09-2015 17:08:14

Perdon....
FireBird 2.5 y el código es desde un programa D7
Gracias

look 17-09-2015 17:08:57

Cita:

Empezado por jars (Mensaje 496858)
Hola amigos.
Hay alguna forma de saber cuantos registros se importaron utilizando:
Código SQL [-]
INSERT INTO TABLA2 SELECT * FROM TABLA1 WHERE....
y lo mismo para cuando es un DELETE FROM ....

Gracias


yo haria algo asi.
Código Delphi [-]
var :res:integer;

with qry do 
begin
 active := false;
 sql.clear;
 sql.add('select count(*) as val from tabla where...');
 active := true;
 res := FieldbyName('val').asInteger;
 active := false;
end;


with qry do 
begin
 active := false;
 sql.clear;
 sql.add('Insert into ....');
 ExeqSql;
end;

/// res , contendria el valor de los registros

jars 17-09-2015 17:16:06

El problema es que cuando son algunos millones de registros tarda mucho.

look 17-09-2015 17:53:59

Cita:

Empezado por jars (Mensaje 496862)
El problema es que cuando son algunos millones de registros tarda mucho.

prueba a indexar los registros involucrados en el where de la sentencia, la lentitud por la cantidad de registros no es mas que una mala estructuracion de indices

ecfisa 17-09-2015 18:01:16

Hola jars.

Firebird cuenta con la variable de contexto ROW_COUNT que contiene el número de columnas que fueron afectadas por la última accion, pero está disponible solamente para SQL procedimental.

Entonces podrías hacer un procedimiento:
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_INSERT_TABLA1 
RETURNS (
     NOROWS INTEGER)
AS
BEGIN 
  INSERT INTO TABLA2
  SELECT * FROM TABLA1;
 
  NOROWS = ROW_COUNT;
  SUSPEND;
END^

SET TERM ; ^

Ejemplo de uso:
Código SQL [-]
SELECT NOROWS AS TOTAL FROM SP_INSERT_TABLA1

Saludos :)

Casimiro Notevi 17-09-2015 18:08:22

Cita:

Empezado por ecfisa (Mensaje 496868)
Firebird cuenta con la variable de contexto ROW_COUNT que contiene el número de columnas que fueron afectadas por la última accion, pero está disponible solamente para SQL procedimental.

Es el mejor método, el más rápido y seguro.

look 17-09-2015 18:14:59

Cita:

Empezado por Casimiro Notevi (Mensaje 496869)
Es el mejor método, el más rápido y seguro.


Bien, siempre se aprende algo nuevo, desconocia esa funcion... :)

Saludos!

jars 17-09-2015 18:29:39

Gracias Ecfisa y Casimiro, es lo que estaba probando ahora.
Look, ya tengo un indice por el campo del where, asi que no es por mala estructuración.
Gracias

Casimiro Notevi 17-09-2015 19:00:53

Cita:

Empezado por look (Mensaje 496870)
Bien, siempre se aprende algo nuevo, desconocia esa funcion... :)
Saludos!

Cierto, todos los días se aprende algo nuevo.

RONPABLO 17-09-2015 22:06:45

Cita:

Empezado por jars (Mensaje 496862)
El problema es que cuando son algunos millones de registros tarda mucho.

A parte que ya tienes una respuesta para lo otro, debes tener en cuenta que varios millones de registros, es más cientos de millones de registros son o deben ser números normales en una tabla y Firebird trata bien con ellos, si se demora mucho haciendo un:
Código SQL [-]
 select count(*) where ...
Debes revisar porque algo puede estar mal, tal vez el indice, tal vez metes en un where un campo con indice con alguna instrucción que anula dicho indice (si por ejemplo haces un substring, un uppercase, en el where este no usará el indice), para verificar puedes buscar en una herramienta (para mis querys yo suelo usar el database worckbench) la información que devuelve de la ejecución de un query, ahí uno puede ver cuantos de los campos que intervienen en el query están o no indexados correctamente, mira un poco y podrás acelerar a cuestiones de milisegundos cosas que pueden durar hasta minutos


La franja horaria es GMT +2. Ahora son las 04:27:14.

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