Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/03/2013, 17:39
adrian_
 
Fecha de Ingreso: abril-2010
Mensajes: 229
Antigüedad: 14 años, 11 meses
Puntos: 3
Procedimiento almacenado

Hola Foro

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
  1. CREATE PROCEDURE SEPOMEX
  2. RETURNS (
  3.     MUNICIPIOS_BASE INTEGER,
  4.     MUNICIPIOS_SEPOMEX INTEGER,
  5.     EXISTENTES_BASE VARCHAR (75),
  6.     EXISTENTES_SEPOMEX VARCHAR (36),
  7.     CONCATENADOS VARCHAR (150),
  8.     MAXID INTEGER)
  9. AS
  10.  
  11.  
  12. DECLARE variable MSepomex VARCHAR(36);
  13. DECLARE variable MBase VARCHAR(36);
  14. DECLARE variable CSColonia VARCHAR(150);
  15. DECLARE variable CBColonia VARCHAR(60);
  16. DECLARE variable Asentamiento VARCHAR(50);
  17. DECLARE variable SMunicipio VARCHAR(75);
  18. DECLARE variable NAsentamiento VARCHAR(33);
  19. DECLARE variable SZona VARCHAR(2);
  20. DECLARE variable IDClase VARCHAR(2);
  21. DECLARE variable SMunicipios VARCHAR(36);
  22. DECLARE variable BMunicipios VARCHAR(36);
  23. DECLARE variable TipoAsentamiento VARCHAR(50);
  24. DECLARE variable MSestado INTEGER;
  25. DECLARE variable ECantidad INTEGER;
  26. DECLARE variable IDSepomex INTEGER;
  27. DECLARE variable IDMunicipio INTEGER;
  28. DECLARE variable SCOficina INTEGER;
  29. DECLARE variable IDAsentamiento INTEGER;
  30. DECLARE variable CCor INTEGER;
  31. DECLARE variable SCodigo INTEGER;
  32. DECLARE variable NMunicipio INTEGER;
  33. DECLARE variable InsertaMunicipio INTEGER;
  34. DECLARE variable NuevoId INTEGER;
  35. DECLARE variable MaximoID INTEGER;
  36. DECLARE variable IDCiudad INTEGER;
  37. DECLARE variable CuentaMB INTEGER;
  38. DECLARE variable CuentaMS INTEGER;
  39.  
  40. BEGIN
  41.  
  42. FOR SELECT ID_ESTADO
  43. FROM ZZ_SPM_ENTIDADES
  44. INTO :ECantidad DO
  45.      BEGIN
  46.  
  47.      SELECT COUNT(DISTINCT ID_MUNICIPIO)
  48.      FROM ZZ_SPM_MUNICIPIOS MB
  49.      /*WHERE MB.ID_ESTADO =:ECantidad*/
  50.      WHERE MB.ID_ESTADO = 1
  51.      INTO :CuentaMB;
  52.  
  53.      SELECT COUNT(DISTINCT UPPER(D_MUNICIPIO))
  54.      FROM TEMPORAL_SEPOMEX MS
  55.      /*WHERE MS.C_ESTADO =:ECantidad*/
  56.      WHERE MS.C_ESTADO = 1
  57.      INTO :CuentaMS;
  58.      
  59.      IF(CuentaMB = CuentaMS) THEN
  60.  
  61.      FOR
  62.      SELECT DISTINCT (TS.D_MUNICIPIO), MB.NOMBRE
  63.      FROM TEMPORAL_SEPOMEX TS
  64.      INNER JOIN ZZ_SPM_MUNICIPIOS MB
  65.      ON TS.D_MUNICIPIO = MB.NOMBRE
  66.      WHERE TS.C_ESTADO =:ECantidad
  67.      INTO :SMunicipios, :BMunicipios DO
  68.      
  69.        BEGIN
  70.          IF(:SMunicipios = :BMunicipios)THEN          
  71.            BEGIN          
  72.            FOR
  73.            SELECT DISTINCT
  74.            UPPER(TS.D_ASENTAMIENTO), UPPER(TS.ID_SEPOMEX),
  75.            UPPER(TS.D_MUNICIPIO), UPPER(SC.NOMBRE), TS.C_ESTADO, TS.D_TIPO_ASENTAMIENTO
  76.            FROM TEMPORAL_SEPOMEX TS
  77.            LEFT OUTER JOIN ZZ_SPM_COLONIAS SC
  78.            ON TS.D_ASENTAMIENTO = SC.NOMBRE
  79.            WHERE TS.C_ESTADO = 1 AND SC.NOMBRE IS NULL
  80.            /*WHERE TS.C_ESTADO =:ECantidad AND SC.NOMBRE IS NULL*/
  81.            INTO :CSColonia, :IDSepomex, :SMunicipio, :CBColonia, :MSestado, :TipoAsentamiento DO
  82.              BEGIN
  83.              IF(:CBColonia IS NULL) THEN
  84.                BEGIN
  85.                  FOR SELECT MAX(ID_COLONIA)
  86.                  FROM ZZ_SPM_COLONIAS
  87.                  WHERE ID_ESTADO = 1
  88.                  /*WHERE ID_ESTADO =:ECantidad*/
  89.                  INTO :MaximoID DO
  90.                    BEGIN
  91.                      MAXID =:MaximoID;
  92.                      NuevoId =:MaximoID +1;
  93.                      FOR SELECT DISTINCT SC.ID_CIUDAD
  94.                      FROM ZZ_SPM_CIUDADES SC
  95.                      WHERE ID_ESTADO =:MSestado AND NOMBRE =:SMunicipio
  96.                      INTO :IDCiudad DO
  97.                        BEGIN
  98.                          FOR SELECT UPPER(C_MUNICIPIO)
  99.                          FROM TEMPORAL_SEPOMEX
  100.                          WHERE D_ASENTAMIENTO =:CSColonia
  101.                          AND C_ESTADO =:MSestado AND D_MUNICIPIO =:SMunicipio
  102.                          INTO :IDMunicipio DO
  103.                           BEGIN
  104.                             FOR SELECT SM.ID_MUNICIPIO
  105.                             FROM ZZ_SPM_MUNICIPIOS SM
  106.                             WHERE SM.ID_MUNICIPIO =:IDMunicipio AND SM.ID_ESTADO =:MSestado
  107.                             INTO :NMunicipio DO                            
  108.                             IF(:IDMunicipio = :NMunicipio) THEN
  109.                               BEGIN InsertaMunicipio =:NMunicipio; END
  110.                             ELSE
  111.                               BEGIN InsertaMunicipio =:NMunicipio; END
  112.                             BEGIN
  113.                               FOR SELECT TS.C_OFICINA
  114.                               FROM TEMPORAL_SEPOMEX TS
  115.                               WHERE ID_SEPOMEX =:IDSepomex
  116.                               INTO :SCOficina DO
  117.                                BEGIN                                
  118.                                  FOR
  119.                                  SELECT DISTINCT ID_ASENTAMIENTO
  120.                                  FROM ZZ_SPM_ASENTAMIENTO SA
  121.                                  INNER JOIN TEMPORAL_SEPOMEX TS
  122.                                  ON SA.NOMBRE = TS.D_TIPO_ASENTAMIENTO
  123.                                  WHERE SA.NOMBRE LIKE '%'||:TipoAsentamiento||'%'
  124.                                  INTO :IDAsentamiento DO
  125.                                    BEGIN
  126.                                      FOR SELECT DISTINCT TS.D_CODIGO
  127.                                      FROM TEMPORAL_SEPOMEX TS
  128.                                      WHERE TS.ID_SEPOMEX =:IDSepomex
  129.                                      INTO :SCodigo DO
  130.                                        BEGIN
  131.                                          FOR SELECT DISTINCT(COR)
  132.                                          FROM ZZ_SPM_COLONIAS
  133.                                          WHERE ID_ESTADO =:MSestado
  134.                                          INTO :CCor DO
  135.                                            BEGIN
  136.                                              FOR SELECT SUBSTR(TS.D_ZONA,1 ,1)
  137.                                              FROM TEMPORAL_SEPOMEX TS
  138.                                              WHERE ID_SEPOMEX =:IDSepomex
  139.                                              INTO :SZona DO
  140.                                                BEGIN
  141.                                                  INSERT INTO ZZ_SPM_COLONIAS
  142.                                                  (ID_COLONIA, ID_ESTADO, ID_CLASE, ID_CIUDAD, ID_MUNICIPIO,
  143.                                                  NOMBRE, REPARTO, SERVICIOS, OFICINA, ID_ASENTAMIENTO, CODIGO,
  144.                                                  COR, ACTUALIZADO, ZONA)
  145.                                                  VALUES(:NuevoId, :MSestado, '00', :IDCiudad, :InsertaMunicipio,
  146.                                                  :CSColonia, NULL, 0 , :SCOficina, :IDAsentamiento, :SCodigo,
  147.                                                  :CCor, CURRENT_TIMESTAMP, :SZona);
  148.                                                   MUNICIPIOS_BASE =:NuevoID;
  149.                                                   MUNICIPIOS_SEPOMEX =:MSestado;
  150.                                                   EXISTENTES_BASE =:CSColonia;
  151.                                                   EXISTENTES_SEPOMEX =: InsertaMunicipio;
  152.                                                END
  153.                                            END
  154.                                        END
  155.                                    END
  156.                                END
  157.                             END
  158.                        END
  159.                        END
  160.                    END
  161.                END
  162.              END
  163.              SUSPEND;
  164.            END
  165.          ELSE          
  166.            CONCATENADOS='realizar insercion de municipio';
  167.        END
  168.      ELSE
  169.        CONCATENADOS = 'Aqui se insertan los municipios';      
  170.        FOR
  171.        SELECT MAX(ID_MUNICIPIO)
  172.        FROM ZZ_SPM_MUNICIPIOS
  173.        WHERE ID_ESTADO = 1
  174.        /*WHERE ID_ESTADO =:ECantidad*/
  175.        INTO :MaximoID DO
  176.          BEGIN
  177.             MAXID =:MaximoID;
  178.             NuevoId =:MaximoID + 1;
  179.           END
  180.        FOR
  181.        SELECT DISTINCT UPPER(TS.D_MUNICIPIO), SM.NOMBRE, TS.C_ESTADO
  182.        FROM TEMPORAL_SEPOMEX TS
  183.        LEFT OUTER JOIN ZZ_SPM_MUNICIPIOS SM
  184.        ON TS.D_MUNICIPIO = SM.NOMBRE
  185.         WHERE TS.C_ESTADO = 1 AND SM.NOMBRE IS NULL
  186.         /*WHERE TS.C_ESTADO =:ECantidad AND SM.NOMBRE IS NULL*/
  187.         INTO :MSepomex, :MBase, :MSestado DO
  188.           BEGIN
  189.             IF(:MBase IS NULL) THEN
  190.               BEGIN
  191.                 INSERT INTO ZZ_SPM_MUNICIPIOS(
  192.                 ID_MUNICIPIO,ID_ESTADO,NOMBRE,
  193.                 RANGO1,RANGO2,RANGO3,RANGO4,RANGO5,RANGO6,RANGO7,RANGO8)
  194.                 VALUES(:NuevoId, :MSestado, :MSepomex,
  195.                 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);                
  196.                 FOR SELECT MAX(ID_CIUDAD)
  197.                 FROM ZZ_SPM_CIUDADES
  198.                 WHERE ID_ESTADO = :MSestado
  199.                 INTO :MaximoID DO
  200.                   BEGIN
  201.                     MAXID =:MaximoID;
  202.                     NuevoId =:MaximoID +1;
  203.                   END
  204.                     INSERT INTO ZZ_SPM_CIUDADES(
  205.                     ID_CIUDAD,ID_ESTADO,NOMBRE,
  206.                     RANGO1,RANGO2,RANGO3,RANGO4)
  207.                     VALUES(:NuevoId, :MSestado, :MSepomex,
  208.                     NULL,NULL,NULL,NULL);
  209.               END
  210.             ELSE
  211.              CONCATENADOS = 'No se encuentran municipios inexistentes';
  212.           END
  213.         SUSPEND;
  214.      END
  215. END

Última edición por gnzsoloyo; 12/03/2013 a las 18:18 Razón: SQL sin etiquetar.