CREATE OR REPLACE FUNCTION sdo2sde(geo SDO_GEOMETRY)
RETURN st_geometry
IS
lx number; --类型 (点、线、面)
coord varchar2(1000); --坐标序列
num number;
i number;
st st_geometry;
BEGIN
lx := geo.SDO_GTYPE;
coord := '';
i := 1;
if lx = 2001 then --点
coord := geo.SDO_POINT.X || ' ' || geo.SDO_POINT.Y;
st := sde.ST_PointFromText('point( '|| coord ||' )',0);
elsif lx = 2002 then --线
num := geo.SDO_ORDINATES.COUNT();
while i<= num loop
if mod(i, 2)=1 then --奇数
coord := coord || geo.SDO_ORDINATES(i) || ' ';
elsif mod(i, 2)=0 then --偶数
coord := coord || geo.SDO_ORDINATES(i) || ',';
end if;
i := i+1;
end loop;
coord := substr(coord, 1, length(coord)-1); --去除最后一个逗号
st := sde.ST_LineFromText('linestring( '|| coord ||' )', 0);
elsif lx = 2003 then --面
num := geo.SDO_ORDINATES.COUNT();
while i<= num loop
if mod(i, 2)=1 then --奇数
coord := coord || geo.SDO_ORDINATES(i) || ' ';
elsif mod(i, 2)=0 then --偶数
coord := coord || geo.SDO_ORDINATES(i) || ',';
end if;
i := i+1;
end loop;
coord := substr(coord, 1, length(coord)-1); --去除最后一个逗号
st := sde.ST_PolyFromText('polygon(( '|| coord ||' ))', 0);
end if;
RETURN st;
END;