layerObj.queryByAttributes changed with Oracle

Fernando Simon fsimon at UNIVALI.BR
Thu Nov 29 10:57:40 EST 2007


Hi Benedikt,
    This is a Oracle Spatial driver change for 5.0. And the source of
this issue was relate with some Filter/FilterItem problems for Oracle
Spatial in early versions (4.x).
    The osFilterItem function in the source code is relate with FILTER
and FILTERITEM definitions for Mapfile (you can see here:
http://mapserver.gis.umn.edu/docs/reference/mapfile/referencemanual-all-pages)
and Mapscript. In the PHPMapscript, the info for queryByAttribute relate
that the parameters that you pass will overwrite what you define for
FILTER/FILTERITEM in Mapfile. In the same doc for queryByAttribute:
"qitem is the item (attribute) on which the query is performed, and
qstring is the expression to match."
     In the source code for 5.0 version this is a new (maybe better)
interpretation for the docs. I believe that this new way is better when
compared with the docs.
     Best regards.

Fernando Simon


Benedikt Rothe wrote:
>
> Hello List
>
> I'm using Mapserer with Oracle/Java-Mapscript and migrating my app
> from Mapserver 4.x to Mapserer 5.x
> and have a problem with layerObj.queryByAttributes.
>
> I used to query features with code like this:
>   alayerObj.queryByAttributes(aMapObj, "ID", "ID=4711",
> mapscript./MS_SINGLE/);
> In Mapserver 5 this code  results in an Mapserver-Error-Message
> stating, that the "SQL command is not properly ended".
>
> The Mapserver-generated SQL-Command includes a Where-Clause of the
> form "ID = ID = 4711".
>
> I had a look in maporaclespatial.c function "osFilteritem".
> Follwing code seems to produce this Where-Clause:
>  if (layer->filteritem != NULL)
>  {
>    sprintf (query_str + strlen(query_str), " %s = ", layer->filteritem);
>    //snprintf (query_str + strlen(query_str), " %s = ",
> layer->filteritem);
>  }
>
> Changing my Java-Code to
>   alayerObj.queryByAttributes(aMapObj, "ID", "4711",
> mapscript./MS_SINGLE/);
> solves the problem.
>
> Questions:
> * Is this a bug in Mapserver or a new feature?  
> * Is this really a change in Mapserver 5.0?
> * Shall I rather change my Java-Code or shall I patch Mapserver/
> maporaclespatial.c/osFilteritem?
>    Would the changed Java-Code work with the Oracle-driver only?
>
> Greetings from Aachen/Germany
> Benedikt Rothe
>
> *Attachement "Error-Message": *(Added Newlines)
> msOracleSpatialLayerWhichShapes(): OracleSpatial error. Error:
> ORA-00933: SQL command not properly ended
>  . Query statement:
> SELECT
>   ID, ID, SHAPE
> FROM
>   (select ID,SHAPE
>    FROM MYTABLE)
>    WHERE  *ID =  ID = 4711*  AND
>    SDO_FILTER(
>      SHAPE, MDSYS.SDO_GEOMETRY(2003, 82015,
>      NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
>      MDSYS.SDO_ORDINATE_ARRAY(2501576.69,5621567,2503419.31,5622567)
> ),'querytype=window') = 'TRUE' .
> Check your data statement.
>
> *Attachement "Part of mapfile":*
>   # Projekte
>   LAYER
>     NAME "PROJEKT"
>     TYPE POINT
>     STATUS DEFAULT
>     #DEBUG ON
>     TEMPLATE "dummy.html"
>     CONNECTION "XXX/YYY at ZZZ"
>     CONNECTIONTYPE oraclespatial
>     DATA "SHAPE FROM (select ID,SHAPE FROM MYTABLE) using unique ID
> srid 82015"
>     CLASS
>       NAME ""
>       STYLE
>         COLOR 0 100 100
>         OUTLINECOLOR 0 0 0
>         SIZE 12
>         SYMBOL 'star'
>       END
>     END
>   END 



More information about the mapserver-users mailing list