我正在运行以下查询:
SELECT SDO_UTIL.TO_WKBGEOMETRY (GEOMETRY),
S_ROUTE,
BLOCK_ID
FROM GEOM_TABLE;
其中GEOMETRY
是SDO_GEOMETRY
类型。问题是,当我运行这个查询时,我得到了以下错误,我认为当我在数据库中错误指定的GEOMETRY
记录上使用SDO_UTIL.TO_WKBGEOMETRY
时,就会发生这种错误。
ORA-29532: Java call terminated by uncaught Java exception: java.lang.RuntimeException: oracle.spatial.util.GeometryExceptionWithContext: For GTYPE_MULTICURVE, interpretation should be 1 or 2
我想要编写一个简单地跳过导致抛出此错误的记录的查询(即返回一个表,该表包含GEOM_TABLE中除抛出错误的行以外的所有行)。我是PL/SQL的新手,曾经尝试过几次涉及循环和异常的查询,但我都没能让它们正常工作。
发布于 2018-10-29 15:59:04
您应该能够将所调用的函数包装在另一个函数中,以捕获并接受错误。类似于:
CREATE FUNCTION to_wkbgeometry_silent (geometry IN SDO_GEOMETRY)
RETURN BLOB IS
BEGIN
RETURN SDO_UTIL.to_wkbgeometry (geometry);
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END to_wkbgeometry_silent;
然后使用子查询过滤掉错误,避免两次调用函数:
SELECT *
FROM (SELECT to_wkbgeometry_silent (geometry) AS geo, s_route, block_id
FROM geom_table)
WHERE geo IS NOT NULL;
(不过,显然您最好捕获并忽略您想要忽略的特定错误,而不是所有错误。)
发布于 2018-10-29 15:25:06
我不知道如何跳过错误,但您可以使用CASE
来避免它们
SELECT CASE GEOMETRY WHEN 1 THEN 1 WHEN 2 THEN 2 ELSE NULL END
FROM (SELECT 1 AS GEOMETRY FROM DUAL -- Fake Table
UNION ALL
SELECT 2 AS GEOMETRY FROM DUAL
UNION ALL
SELECT 3 AS GEOMETRY FROM DUAL);
在您的示例中:
SELECT
CASE GEOMETRY WHEN 1 THEN SDO_UTIL.TO_WKBGEOMETRY(GEOMETRY) WHEN 2 THEN SDO_UTIL.TO_WKBGEOMETRY(GEOMETRY) ELSE NULL END,
S_ROUTE,
BLOCK_ID
FROM GEOM_TABLE;
https://stackoverflow.com/questions/53048399
复制