賞金將在 7 天后到期。此問題的答案有資格獲得 50聲望賞金。 User1974想要獎勵現有的答案。
甲骨文 18c:
SHAPE.SDO_ORDINATES(1)我可以使用自定義 PL/SQL 函式從 SDO_GEOMETRY 中提取起點 X 坐標:
with
function startpoint_x(shape in sdo_geometry) return number
is
begin
return
shape.sdo_ordinates(1);
end;
select
startpoint_x(shape) as startpoint_x
from
(select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
from dual)
STARTPOINT_X
------------
1
但是,如果我嘗試純粹在 SQL 查詢中執行此操作,則會出現錯誤:
select
(shape).sdo_ordinates(1) as startpoint_x
from
(select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
from dual)
ORA-00904: "MDSYS"."SDO_GEOMETRY"."SDO_ORDINATES": invalid identifier
對于它的價值,如果我要洗掉 (1) 并選擇整個sdo_ordinates屬性,那么這將起作用:
select
(shape).sdo_ordinates as ordinates
from
(select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
from dual)
ORDINATES
------------------------
SDO_ORDINATE_ARRAY(1, 2)
db<>小提琴
但當然,這不是我想要的。我想以數字形式獲取起點 X 坐標。
為什么SHAPE.SDO_ORDINATES(1)在 PL/SQL 中有效,但在 SQL 查詢中無效?
uj5u.com熱心網友回復:
為什么
SHAPE.SDO_ORDINATES(1)在 PL/SQL 中有效,但在 SQL 查詢中無效?
因為 SQL 不支持按索引提取集合元素的語法。它不僅僅是 SDO 物件,而是任何集合:
SELECT SYS.ODCIVARCHAR2LIST('a', 'b', 'c')(1) FROM DUAL;
輸出:
ORA-03001: unimplemented feature
和:
SELECT l.list(1)
FROM (SELECT SYS.ODCIVARCHAR2LIST('a', 'b', 'c') AS list FROM DUAL) l;
輸出:
ORA-00904: "L"."LIST": invalid identifier
(我認為這意味著它正在嘗試將其決議為一個函式,但錯誤訊息沒有前一個有用/明顯。)
有一些獲取值的方法,但它更復雜,因為您需要使用表集合運算式取消參考整個集合,然后過濾以獲取所需的行:
SELECT (
SELECT COLUMN_VALUE
FROM TABLE(s.shape.sdo_ordinates)
FETCH FIRST ROW ONLY
) as startpoint_x
FROM (
select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape from dual
) s
db<>在這里擺弄
uj5u.com熱心網友回復:
我的猜測是 varray 和表集合必須被視為表,而 SQL (3) 在本機 SQL 中不支持它們。
uj5u.com熱心網友回復:
看看這樣的解決方法是否有幫助......
這就是你所擁有的并且它有效:
SQL> select
2 (shape).sdo_ordinates as ordinates
3 from
4 (select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
5 from dual);
ORDINATES
------------------------------------------------------------
SDO_ORDINATE_ARRAY(1, 2, 3, 4, 5, 6)
這是您嘗試過的,但它不起作用:
SQL> select
2 (shape).sdo_ordinates(1) as startpoint_x
3 from
4 (select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
5 from dual);
(shape).sdo_ordinates(1) as startpoint_x
*
ERROR at line 2:
ORA-00904: "MDSYS"."SDO_GEOMETRY"."SDO_ORDINATES": invalid identifier
這是一種解決方法:
SQL> select
2 sdo_geom.sdo_min_mbr_ordinate(shape, 1) as startpoint_x
3 from
4 (select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape
5 from dual);
STARTPOINT_X
------------
1
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489471.html
