2013-04-18 35 views
0

我有一个函数从C库调用函数。无论如何,我可以从调用C函数的Postgres函数中捕获该异常?从C函数处理异常

下面是我打电话的功能:

-- 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功能不进入抗辩N块如预期。

下面是我收到错误消息:

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


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

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

回答

1

如果我猜你的意思正确,那么我怀疑你用C语言实现PostgreSQL的功能是提高一个PostgreSQL例外。如果是这样,你就不能在普通的SQL中捕获和处理它 - 但你可以使用PL/PgSQL BEGIN ... EXCEPTION块。有关其异常处理功能的详细信息,请参阅PL/PgSQL文档。

进一步的讨论表明,真正的问题与异常处理无关,实际上是在调用函数的UPDATE查询中几何类型之间的不匹配。

+0

我已经试过用下面的函数做这件事,但它从来没有进入异常块:http://pastebin.com/egeAmepD – ChrisInCambo

+0

我也尝试在BEGIN/EXCEPTION块中包装ST_MakeValid调用,但没有要么提醒通知。我哪里错了? – ChrisInCambo

+0

@ChrisInCambo这些是在你的问题中提到的有用的细节。请修改您的问题 - 在您的问题中,添加您正在获取的错误消息**和您的PostgreSQL版本**的完整准确文本。现在解释你的问题涉及到太多的猜测。请提供*详细信息* - 你的函数是什么,这个“C语言”函数是什么等等。我猜对了,你正在谈论一个简单的PostGIS C函数,可以从SQL调用,还是这是别的? –