Tengo un procedimiento almacenado el cual tiene que actualizar los municipios y colonias existentes en la base de datos, como no se si han cambiado los id's hago busquedas de estos para poder insertar asignando a los municipios la colonia correcta, pero si corro el procedimiento por lineas funciona muy bien hasta la segunda inserción en donde truena desconozco porque y al ejecutarlo manda un error de llave foranea cuando este error no debe de presentarse ya que busco el ultimo id y se agrega su valor espero puedan ayudarme, esta en echo en interbase o firebird 3 aqui les dejo el codigo.
Código SQL:
Ver original
CREATE PROCEDURE SEPOMEX RETURNS ( MUNICIPIOS_BASE INTEGER, MUNICIPIOS_SEPOMEX INTEGER, EXISTENTES_BASE VARCHAR (75), EXISTENTES_SEPOMEX VARCHAR (36), CONCATENADOS VARCHAR (150), MAXID INTEGER) AS DECLARE variable MSepomex VARCHAR(36); DECLARE variable MBase VARCHAR(36); DECLARE variable CSColonia VARCHAR(150); DECLARE variable CBColonia VARCHAR(60); DECLARE variable Asentamiento VARCHAR(50); DECLARE variable SMunicipio VARCHAR(75); DECLARE variable NAsentamiento VARCHAR(33); DECLARE variable SZona VARCHAR(2); DECLARE variable IDClase VARCHAR(2); DECLARE variable SMunicipios VARCHAR(36); DECLARE variable BMunicipios VARCHAR(36); DECLARE variable TipoAsentamiento VARCHAR(50); DECLARE variable MSestado INTEGER; DECLARE variable ECantidad INTEGER; DECLARE variable IDSepomex INTEGER; DECLARE variable IDMunicipio INTEGER; DECLARE variable SCOficina INTEGER; DECLARE variable IDAsentamiento INTEGER; DECLARE variable CCor INTEGER; DECLARE variable SCodigo INTEGER; DECLARE variable NMunicipio INTEGER; DECLARE variable InsertaMunicipio INTEGER; DECLARE variable NuevoId INTEGER; DECLARE variable MaximoID INTEGER; DECLARE variable IDCiudad INTEGER; DECLARE variable CuentaMB INTEGER; DECLARE variable CuentaMS INTEGER; BEGIN FOR SELECT ID_ESTADO FROM ZZ_SPM_ENTIDADES INTO :ECantidad DO BEGIN SELECT COUNT(DISTINCT ID_MUNICIPIO) FROM ZZ_SPM_MUNICIPIOS MB /*WHERE MB.ID_ESTADO =:ECantidad*/ WHERE MB.ID_ESTADO = 1 INTO :CuentaMB; SELECT COUNT(DISTINCT UPPER(D_MUNICIPIO)) FROM TEMPORAL_SEPOMEX MS /*WHERE MS.C_ESTADO =:ECantidad*/ WHERE MS.C_ESTADO = 1 INTO :CuentaMS; IF(CuentaMB = CuentaMS) THEN FOR SELECT DISTINCT (TS.D_MUNICIPIO), MB.NOMBRE FROM TEMPORAL_SEPOMEX TS INNER JOIN ZZ_SPM_MUNICIPIOS MB ON TS.D_MUNICIPIO = MB.NOMBRE WHERE TS.C_ESTADO =:ECantidad INTO :SMunicipios, :BMunicipios DO BEGIN IF(:SMunicipios = :BMunicipios)THEN BEGIN FOR SELECT DISTINCT UPPER(TS.D_ASENTAMIENTO), UPPER(TS.ID_SEPOMEX), UPPER(TS.D_MUNICIPIO), UPPER(SC.NOMBRE), TS.C_ESTADO, TS.D_TIPO_ASENTAMIENTO FROM TEMPORAL_SEPOMEX TS LEFT OUTER JOIN ZZ_SPM_COLONIAS SC ON TS.D_ASENTAMIENTO = SC.NOMBRE WHERE TS.C_ESTADO = 1 AND SC.NOMBRE IS NULL /*WHERE TS.C_ESTADO =:ECantidad AND SC.NOMBRE IS NULL*/ INTO :CSColonia, :IDSepomex, :SMunicipio, :CBColonia, :MSestado, :TipoAsentamiento DO BEGIN IF(:CBColonia IS NULL) THEN BEGIN FOR SELECT MAX(ID_COLONIA) FROM ZZ_SPM_COLONIAS WHERE ID_ESTADO = 1 /*WHERE ID_ESTADO =:ECantidad*/ INTO :MaximoID DO BEGIN MAXID =:MaximoID; NuevoId =:MaximoID +1; FOR SELECT DISTINCT SC.ID_CIUDAD FROM ZZ_SPM_CIUDADES SC WHERE ID_ESTADO =:MSestado AND NOMBRE =:SMunicipio INTO :IDCiudad DO BEGIN FOR SELECT UPPER(C_MUNICIPIO) FROM TEMPORAL_SEPOMEX WHERE D_ASENTAMIENTO =:CSColonia AND C_ESTADO =:MSestado AND D_MUNICIPIO =:SMunicipio INTO :IDMunicipio DO BEGIN FOR SELECT SM.ID_MUNICIPIO FROM ZZ_SPM_MUNICIPIOS SM WHERE SM.ID_MUNICIPIO =:IDMunicipio AND SM.ID_ESTADO =:MSestado INTO :NMunicipio DO IF(:IDMunicipio = :NMunicipio) THEN BEGIN InsertaMunicipio =:NMunicipio; END ELSE BEGIN InsertaMunicipio =:NMunicipio; END BEGIN FOR SELECT TS.C_OFICINA FROM TEMPORAL_SEPOMEX TS WHERE ID_SEPOMEX =:IDSepomex INTO :SCOficina DO BEGIN FOR SELECT DISTINCT ID_ASENTAMIENTO FROM ZZ_SPM_ASENTAMIENTO SA INNER JOIN TEMPORAL_SEPOMEX TS ON SA.NOMBRE = TS.D_TIPO_ASENTAMIENTO WHERE SA.NOMBRE LIKE '%'||:TipoAsentamiento||'%' INTO :IDAsentamiento DO BEGIN FOR SELECT DISTINCT TS.D_CODIGO FROM TEMPORAL_SEPOMEX TS WHERE TS.ID_SEPOMEX =:IDSepomex INTO :SCodigo DO BEGIN FOR SELECT DISTINCT(COR) FROM ZZ_SPM_COLONIAS WHERE ID_ESTADO =:MSestado INTO :CCor DO BEGIN FOR SELECT SUBSTR(TS.D_ZONA,1 ,1) FROM TEMPORAL_SEPOMEX TS WHERE ID_SEPOMEX =:IDSepomex INTO :SZona DO BEGIN INSERT INTO ZZ_SPM_COLONIAS (ID_COLONIA, ID_ESTADO, ID_CLASE, ID_CIUDAD, ID_MUNICIPIO, NOMBRE, REPARTO, SERVICIOS, OFICINA, ID_ASENTAMIENTO, CODIGO, COR, ACTUALIZADO, ZONA) VALUES(:NuevoId, :MSestado, '00', :IDCiudad, :InsertaMunicipio, :CSColonia, NULL, 0 , :SCOficina, :IDAsentamiento, :SCodigo, :CCor, CURRENT_TIMESTAMP, :SZona); MUNICIPIOS_BASE =:NuevoID; MUNICIPIOS_SEPOMEX =:MSestado; EXISTENTES_BASE =:CSColonia; EXISTENTES_SEPOMEX =: InsertaMunicipio; END END END END END END END END END END END SUSPEND; END ELSE CONCATENADOS='realizar insercion de municipio'; END ELSE CONCATENADOS = 'Aqui se insertan los municipios'; FOR SELECT MAX(ID_MUNICIPIO) FROM ZZ_SPM_MUNICIPIOS WHERE ID_ESTADO = 1 /*WHERE ID_ESTADO =:ECantidad*/ INTO :MaximoID DO BEGIN MAXID =:MaximoID; NuevoId =:MaximoID + 1; END FOR SELECT DISTINCT UPPER(TS.D_MUNICIPIO), SM.NOMBRE, TS.C_ESTADO FROM TEMPORAL_SEPOMEX TS LEFT OUTER JOIN ZZ_SPM_MUNICIPIOS SM ON TS.D_MUNICIPIO = SM.NOMBRE WHERE TS.C_ESTADO = 1 AND SM.NOMBRE IS NULL /*WHERE TS.C_ESTADO =:ECantidad AND SM.NOMBRE IS NULL*/ INTO :MSepomex, :MBase, :MSestado DO BEGIN IF(:MBase IS NULL) THEN BEGIN INSERT INTO ZZ_SPM_MUNICIPIOS( ID_MUNICIPIO,ID_ESTADO,NOMBRE, RANGO1,RANGO2,RANGO3,RANGO4,RANGO5,RANGO6,RANGO7,RANGO8) VALUES(:NuevoId, :MSestado, :MSepomex, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); FOR SELECT MAX(ID_CIUDAD) FROM ZZ_SPM_CIUDADES WHERE ID_ESTADO = :MSestado INTO :MaximoID DO BEGIN MAXID =:MaximoID; NuevoId =:MaximoID +1; END INSERT INTO ZZ_SPM_CIUDADES( ID_CIUDAD,ID_ESTADO,NOMBRE, RANGO1,RANGO2,RANGO3,RANGO4) VALUES(:NuevoId, :MSestado, :MSepomex, NULL,NULL,NULL,NULL); END ELSE CONCATENADOS = 'No se encuentran municipios inexistentes'; END SUSPEND; END END