Oracle PL / SQL - возвращает таблицу, которая пропускает записи, в которых выдается ошибка - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю следующий запрос:

SELECT SDO_UTIL.TO_WKBGEOMETRY (GEOMETRY),
       S_ROUTE,
       BLOCK_ID
  FROM GEOM_TABLE;

Где GEOMETRY - тип SDO_GEOMETRY. Проблема в том, что когда я запускаю этот запрос, я получаю следующую ошибку, которая, как мне кажется, происходит, когда я использую SDO_UTIL.TO_WKBGEOMETRY для GEOMETRY записей, которые неправильно указаны в базе данных.

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 и попытался выполнить несколько запросов, включающих циклы и исключения, но я не смог заставить их работать.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы должны быть в состоянии обернуть функцию, которую вы вызываете, в другую функцию, которая перехватывает и поглощает ошибки. Что-то вроде:

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;

(Хотя, очевидно, вам лучше отлавливать и игнорировать конкретную ошибку, которую вы хотите игнорировать, а не все ошибки.)

0 голосов
/ 29 октября 2018

Я не знаю, как пропустить ошибки, но вы могли бы избежать их, используя 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;
...