我有一个从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
答案 0 :(得分:1)
如果我猜错了你的意思,那么我怀疑你有一个在C中实现的PostgreSQL函数,它引发了PostgreSQL异常。如果是这样,您无法在普通SQL中捕获并处理它 - 但您可以使用PL / PgSQL BEGIN ... EXCEPTION
块。有关其异常处理功能的详细信息,请参阅PL / PgSQL文档。
进一步的讨论表明,真正的问题与异常处理无关,实际上是调用函数的UPDATE
查询中几何类型之间的不匹配。