0

C ライブラリから関数を呼び出す関数があります。C関数を呼び出しているPostgres関数からその例外をキャッチできる方法はありますか?

私が呼んでいる関数は次のとおりです。

-- Function: public.st_makevalid(geometry)

-- DROP FUNCTION public.st_makevalid(geometry);

CREATE OR REPLACE FUNCTION public.st_makevalid(geometry)
 RETURNS geometry AS
'$libdir/postgis-2.0', 'ST_MakeValid'
  LANGUAGE c IMMUTABLE STRICT
  COST 100;
ALTER FUNCTION public.st_makevalid(geometry) OWNER TO postgres;
COMMENT ON FUNCTION public.st_makevalid(geometry) IS 'args: input - Attempts to make an         invalid geometry valid w/out loosing vertices.';

これが私がそれを呼び出している関数です:

CREATE OR REPLACE FUNCTION public.mango_repair(geometry)
  RETURNS geometry AS
$BODY$
    DECLARE
        the_geom geometry := $1;
        reason text := ST_IsValidReason(the_geom);
    BEGIN
        IF reason LIKE 'Self-intersection%' THEN
            the_geom = ST_MakeValid(ST_Boundary(the_geom));
        END IF;
        RETURN the_geom;
    EXCEPTION
        WHEN OTHERS THEN
            RAISE NOTICE 'something went wrong';
            RETURN the_geom;
    END;
$BODY$
  LANGUAGE plpgsql STABLE STRICT
  COST 100;
ALTER FUNCTION public.mango_repair(geometry) OWNER TO postgres;

そして、SQLから呼び出す方法は次のとおりです。

UPDATE "test_layer" SET the_geom = mango_repair(the_geom) WHERE NOT ST_IsValid(the_geom);

その SQL を実行すると、次のエラーが発生し、mango_repair 関数が期待どおりに EXCEPTION ブロックに入りません。

私が受け取っているエラーメッセージは次のとおりです。

ERROR:  Geometry type (MultiLineString) does not match column type (MultiPolygon)


********** Error **********

ERROR: Geometry type (MultiLineString) does not match column type (MultiPolygon)
SQL state: 22023
4

1 に答える 1

1

私があなたの言いたいことを正しく推測しているとしたら、C で実装された PostgreSQL 関数が PostgreSQL 例外を発生させているのではないかと思います。その場合、通常の SQL ではそれをキャッチして処理することはできませんが、PL/PgSQLBEGIN ... EXCEPTIONブロックを使用することはできます。例外処理機能の詳細については、PL/PgSQL のドキュメントを参照してください。

さらに議論を進めると、本当の問題は例外処理とは何の関係もなく、実際にはUPDATE、関数が呼び出されているクエリ内のジオメトリ タイプ間の不一致であることが明らかになりました。

于 2013-04-18T08:11:00.110 に答える