How does st_geometry works?

st_geometry is a user defined type of the Oracle database. A user defined type in Oracle is like a class definition in .Net. It allows you to create a type with properties and methods. It also supports inheritance, which in st_geometry is used to define an object hierarchy:
st_geometry

As you can see from the diagram, st_geometry is in fact an abstract class. Which means that in order to create an "instance" of the class you need to use one of the inheritors.

st_geometry’s user defined type is defined inside the SDE schema in your database. Once you’ve installed SDE on your database you can connect to your sde schema and view st_geometry and all of his inheritors.

This is an example of a table which contains a st_geometry column:

CREATE TABLE
(
	code	NUMBER(10),
	name	VARCHAR2(200)
	shape	st_geometry
);

In practice user defined types are saved as BLOB. This means that when you define a column with a st_geometry type, and try to query this column, you will see a BLOB.

You can create an "instance" of st_geometry be using a constructor (yes, a constructor!):

INSERT INTO buildings(code,name,shape)
VALUES(buildings_s.NEXTVAL,"Doron Plaza",st_point(10,10,1));

This query will create a new row for the building “Doron Plaza” which is positioned in (10,10). The third parameter in the st_point constructor represents a spatial reference index, but we will discuss this later.

Properties are defined in the type definition. That means that you can access the properties like you use properties in C#:

SELECT b.name,b.shape.numpts 
FROM buildings;

This query will retrieve the number of points in the building’s shape.

Operators

In st_geometry introduction , I showed the following example:

SELECT * 
FROM buildings b   
WHERE sde.st_intersects(b.shape,st_point('POINT (35.122 32.999)',1)) = 1;

This statement uses an operator which returns 1, if the given shapes intersects (It actually returns a st_geometry instance of the intersection).

If you look in the type definition, you will find a reference of the operator to a package called ST_GEOMETRY_SHAPELIB_PKG. This package defines an external procedure call. This means that the actual processing of the data is done out of the Oracle process with an external library – ST_SHAPELIB.

Simply, this means that before you can start using st_geometry in SQL, you need to configure Oracle to "know" were this external library is. I will discuss this in st_geometry configuration.

This also means, that st_geometry functions and operators, are slower then internal Oracle procedures because there's a context switch inside the DB server.

You can find a full list of all the operators available for st_geometry in ESRI's documentation.

Spatial Reference

As you well know, each layer is defined with a spatial reference. st_geometry columns contains a property which contains a number that represents a spatial reference. Notice, that number is NOT the Well-Known Id of the spatial reference.

So, what is this number?
This number is an index of a row in a table called sde.st_spatial_references.
If you never used st_geometry in your database and you query this table, you will see that the table is actually empty.
Why? I have no idea, but in order to insert data in an st_geometry column, you need to fill this table.
The quickest way we found to do it is to create a dummy table using ArcCatalog with an st_geometry column (you do that by creating a feature layer and selecting the st_geometry configuration keyword) and the spatial reference you want to use. After you do that, you can query the st_spatial_references table and you can see a new row with your spatial reference.
You can also notice there's a column in this table – CSID which contains the well-known id of the spatial reference.
You can now use the index of this row to insert data to the table, like I presented in the example above.

Another thing you need to notice is that the spatial reference definition is done when creating a new row, not when creating the table.
That means the the same table can have rows with different spatial references.

Well that was a quick overview of the important subject concerning st_geometry.
In the next post I will show you how to configure st_geometry, so you can use it in simple sql queries.