【问题标题】:How to skip error lines in an insert db2?如何跳过插入 db2 中的错误行?
【发布时间】:2021-01-20 18:01:48
【问题描述】:

我真的需要你的帮助。我的情况如下: 我正在尝试在表中插入地理空间数据,但是有一些未关闭的多面体并给出错误。当错误发生时,它会取消插入并且不插入任何行。我想实现一个跳过错误行并插入正确行的过程。

我正在使用 db2 数据库。 这是我正在处理的最后一个代码:

CREATE OR REPLACE PROCEDURE DDM.GEOMETRY_TESTE ()
LANGUAGE SQL

BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '38SSL';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '38SSP';
    BEGIN
        CONTINUE;
    END;

    INSERT INTO ddm.DM_SICAR_GEOMETRY_TESTE (IDGEOSIGAM, ID_ORIGEM, TIPO_AREA, TIPO_COORDENADA, AREA_GEO, COORDENADAS, CENTROIDE, COORDENADAS_WKT, TESTE)
    SELECT  
        b.IDGEOSIGAM
        ,b.ID_ORIGEM
        ,b.TIPO_AREA
        ,b.TIPO_COORDENADA
        ,b.AREA_GEO
        ,db2gse.ST_Point(CONCAT('point(',SUBSTRING(COORDENADAS2,1,LENGTH(b.COORDENADAS2)-2)||')'),1) COORDENADAS
        ,db2gse.ST_centroid(db2gse.ST_Point(CONCAT('point(',SUBSTRING(b.COORDENADAS2,1,LENGTH(b.COORDENADAS2)-2)||')'),1)) CENTROIDE
        ,CASE
            WHEN b.TIPO_COORDENADA = 'Point' THEN CONCAT('POINT(',SUBSTRING(COORDENADAS2,1,LENGTH(COORDENADAS2)-2)||')')
            WHEN b.TIPO_COORDENADA = 'MultiPolygon' THEN CONCAT('MULTIPOLYGON(((',SUBSTRING(COORDENADAS2,1,LENGTH(COORDENADAS2)-2)||')))') 
         END COORDENADAS_WKT
        ,CASE
            WHEN b.TIPO_COORDENADA = 'Point' THEN db2gse.ST_Point(CONCAT('POINT(',SUBSTRING(b.COORDENADAS2,1,LENGTH(b.COORDENADAS2)-2)||')'),1) 
            WHEN b.TIPO_COORDENADA = 'MultiPolygon' THEN db2gse.ST_MultiPolygon(CONCAT('MULTIPOLYGON(((',SUBSTRING(b.COORDENADAS2,1,LENGTH(b.COORDENADAS2)-2)||')))'),1)
         END TESTE
    FROM 
        (
        SELECT 
            a.IDGEOSIGAM
            ,a.ID_ORIGEM
            ,a.TIPO_AREA
            ,a.TIPO_COORDENADA
            ,a.AREA_GEO
            ,SUBSTRING(xmlserialize(xmlagg(xmltext(a.LONGLATI) ORDER BY a.ID_ORIGEM, a.IDGEOSIGAM, a.ID_SEQ) as CLOB(1073741824)), 0) COORDENADAS2
        FROM
            (   
            SELECT 
                g.IDGEOSIGAM 
                ,g.ID_ORIGEM 
                ,g.TIPO_AREA
                ,c.TIPO_COORDENADA 
                ,g.AREA_GEO 
                ,c.ID_SEQ 
                ,c.LONGITUDE 
                ,c.LATITUDE 
                ,CONCAT(c.LATITUDE||' '||c.LONGITUDE,', ') LONGLATI
            FROM 
                ddm.DM_SICAR_GEO g
                INNER JOIN ddm.DM_SICAR_GEO_COORDENADAS c ON c.ID_ORIGEM = g.ID_ORIGEM AND c.IDGEOSIGAM = g.IDGEOSIGAM 
            WHERE 
                g.IDGEOSIGAM in (3274, 49069, 63397, 20224, 20222) 
                --g.ID_ORIGEM = 478
            ORDER BY 
                g.ID_ORIGEM
                ,g.IDGEOSIGAM
                ,c.ID_SEQ 
            ) a
        GROUP BY
            a.IDGEOSIGAM
            ,a.ID_ORIGEM
            ,a.TIPO_AREA
            ,a.TIPO_COORDENADA
            ,a.AREA_GEO
        ) b;
END

【问题讨论】:

    标签: sql db2 procedure


    【解决方案1】:

    可能解决此类问题的最佳方法是为自己创建一些 UDF,这些 UDF 包装了导致错误的函数(或隐式转换)。例如。你可以用这个

    /*
     * Runs ST_MULTIPOLYGON but will return NULL if the function errors out with GSE3421N  Polygon is not closed."
     */
    
    CREATE OR REPLACE FUNCTION DB_MULTIPOLYGON(i CLOB(2G), srs_id INT DEFAULT 4326)
    RETURNS db2gse.ST_MULTIPOLYGON
        NO EXTERNAL ACTION
        DETERMINISTIC
    BEGIN 
      DECLARE NOT_VALID CONDITION FOR SQLSTATE '38H15';
      DECLARE EXIT HANDLER FOR NOT_VALID RETURN NULL;
      --
      RETURN db2gse.ST_MULTIPOLYGON(I, SRS_ID );
    END
    

    然后,如果您将任何对 ST_MULTIPOLYGON 的调用更改为 DB_MULTIPOLYGON,如果多边形未关闭,您将返回 NULL

    db2 -x "values ST_MultiPolygon ('multipolygon (( (3 3, 4 6, 5 3,    3 5) ))', 1)"
    

    会给

    SQL20571N  An error occurred in a spatial routine: "GSE3421N  
      Polygon is not closed.".  SQLSTATE=38H15
    

    但是这个

    db2 -x "values DB_MultiPolygon ('multipolygon (( (3 3, 4 6, 5 3, 3 5) ))', 1)" 
    

    将返回 NULL,然后您可以选择插入或使用 WHERE 过滤掉它

    【讨论】:

    • 首先非常感谢Paul的及时归还,我相信这就是路径。当我试图执行通过它的命令时,它给出了这个错误: SQL Error [42704]: "ST_MULTIPOLYGON" is an undefined name .. SQLCODE = -204, SQLSTATE = 42704, DRIVER = 4.26.14 有什么建议吗?
    • 在我的函数代码中的函数前添加db2gse.
    • 不幸的是,我遇到了这个错误:SQL 错误 [429BB]:在例程、复合 SQL 语句或游标值构造函数的参数列表中不支持参数或 SQL 变量“RETURNS”的数据类型.. SQLCODE = -789,SQLSTATE = 429BB,驱动程序 = 4.26.14
    • 我相信这将是完美的方法,但它不起作用。
    • 请定义“不工作”。运行我上面的 CREATE FUNCTION 语句时是否出现错误?
    猜你喜欢
    • 2017-09-17
    • 2011-11-29
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多