Oracle 空间请求在一个实例上工作而不在另一个实例上工作

Oracle spatial request working on one instance and not on another

我有这个由 Geoserver 生成的语句

SELECT
shape AS shape
FROM
    (
        SELECT
            c.chantier_id      id,
            sdo_geom.sdo_buffer(c.shape, m.diminfo, 1) shape,
            c.datedebut        datedebut,
            c.datefin          datefin,
            o.nom              operation,
            c.brouillon        brouillon,
            e.code             etat,
            u.utilisateur_id   utilisateur,
            u.groupe_id        groupe
        FROM
            user_sdo_geom_metadata   m, lyv_chantier             c
            JOIN lyv_utilisateur          u ON c.createur_id = u.utilisateur_id
            JOIN lyv_etat                 e ON c.etat_id = e.etat_id
            JOIN lyv_operation            o ON c.operation = o.id
        WHERE
            m.table_name = 'LYV_CHANTIER'
            AND m.column_name = 'SHAPE'
    ) vtable
WHERE
    ( brouillon = 0
      AND ( etat != 'archive'
            OR etat IS NULL )
      AND sdo_filter(shape, mdsys.sdo_geometry(2003, 4326, NULL, mdsys.sdo_elem_info_array(1, 1003, 1), mdsys.sdo_ordinate_array(
      2.23365783691406, 48.665657043457, 2.23365783691406, 48.9341354370117, 2.76649475097656, 48.9341354370117, 2.76649475097656, 48.665657043457, 2.23365783691406, 48.665657043457)), 'mask=anyinteract querytype=WINDOW') = 'TRUE' );

在我的本地实例上(dockerized 如果可以解释任何事情)它工作正常,但在另一个实例上我得到一个错误:

ORA-13226: interface not supported without a spatial index

我猜 SDO_FILTER 应用于 SDO_BUFFER 的结果,因此没有索引。
但为什么它在我的本地实例上工作?!
是否有某种奇怪的配置恶作剧可以解释不同的行为?

编辑:这背后的想法是用 Oracle 数据库解决 Geoserver 中的一个错误,它只呈现多点几何图形的第一个点,但与 MutltiPolygon 一起工作。 我在 Geoserver 中使用 SQL 视图作为层(因此我猜是子选择)。

首先,您需要在这里进行一些调试。 连接到每个实例,使用与 Geoserver 的数据源相同的用户,并且 运行 sql。从相同的连接(在每个实例中),您还必须验证用户的元数据视图 (user_sdo_geom_metadata) 是否具有 table 的条目并且 table 是否具有空间索引 - 其所有者是与您连接的用户相同。
此外,您的查询(select ... 来自 'vtable')有一个列 'shape',它是列 lyv_chantier.shape 的缓冲区。此 sql 中的 sdo_filter 需要 vtable.shape 上的空间索引 - 这不存在。您应该尝试使用不同的别名(例如 buf_shape)和 sdo_filter(buf_shape,...) - 看看 sql 是否在这两种情况下都失败了,因为它应该。

我现在有点赶时间,所以我的说明已经总结了。如果需要,请执行此调试并 post 结果。然后我们可以进入细节。

编辑:从您的努力来看,我认为最简单的方法是:1) 添加第二个几何列到 lyv_chantier(例如 buf_shp)。 2) 更新 lyv_chantier 设置 buf_shp = sdo_geom.sdo_buffer(shape,...)。 3) 将值(lyv_chantier、buf_shp、...)插入 user_sdo_geom_metadata。 4) 在列 buf_shp 上创建空间索引。您可能需要考虑在形状发生变化时更新 buf_shp 的触发器...
这是一种非常实用的方法,但您没有提供有关您的案例的任何信息(什么是 oracle 版本,table 有多少行,它是如何使用的,为什么要使用 sdo_buffer, 等), 所以这是我现在的建议。
此外,由于您很可能在 Geoserver 中使用 sql 视图作为层(您对此也没有说任何事情),因此您也可以考虑使用纯 GS 功能来实现您的目标。
最后,如果不描述您的目标,就很难提供更加量身定制的内容。