2016-05-09 80 views
0

如何使用帶有Oracle命名參數語法的關鍵字?下面給我「ORA-00936:缺少表達式」,因爲「number'-說法:Oracle命名參數

select b.g3e_fid 
    , a.g3e_fid 
    , sdo_nn_distance(1) 
from acn a, b$gc_fitface_s b 
where mdsys.sdo_nn (geometry1 => a.g3e_geometry, geometry2 => b.g3e_geometry, param => 'sdo_num_res=1', number=>1) = 'TRUE' and b.g3e_fid = 57798799; 

如果我運行它沒有命名的參數是罰款。

謝謝,Steef

+0

是參數名稱'數字'?這不是一個保留字嗎? – pablomatico

+0

是的。我可以使用帶保留字的命名參數嗎? – Steef

回答

-1

你好,在你的問題提示。有兩種方法可以消除這個RESERVED關鍵字ISSUE。

1)使用「」使用任何RESERVED關鍵字進行調用。但請記住,這不是一個好的編碼習慣。 例如>

SELECT b.g3e_fid , 
    a.g3e_fid , 
    sdo_nn_distance(1) 
FROM acn a, 
    b$gc_fitface_s b 
WHERE mdsys.sdo_nn 
(geometry1 => a.g3e_geometry, 
geometry2 => b.g3e_geometry, 
"param" => 'sdo_num_res=1', 
"NUMBER"=>1) = 'TRUE' 
AND b.g3e_fid = 57798799; 

2)其次,你可以直接調用該函數,而不使用 「=>」 如下圖所示

例如>

SELECT b.g3e_fid , 
    a.g3e_fid , 
    sdo_nn_distance(1) 
FROM acn a, 
    b$gc_fitface_s b 
WHERE mdsys.sdo_nn 
(a.g3e_geometry, 
b.g3e_geometry, 
'sdo_num_res=1', 
1) = 'TRUE' 
AND b.g3e_fid = 57798799; 
+0

我可以知道嗎? –

1

儘管就可以在保留字問題得到在您的電話中,將名稱用@AvrajitRoy建議的雙引號括起來,例如... "NUMBER"=>1) = 'TRUE'...,您實際上並未取得多大成就。 Oracle允許您通過名稱引用參數,但它沒有對這些信息做任何事情。

MDSYS.SDO_NNspatial operator,不是直接調用函數。有一個支持它的函數 - 您可以從MDSYS的模式腳本中看到它實際上調用了prtv_idx.nn - 但該函數的形式參數的名稱不相關。隨着一些挖掘,你可以看到那些實際上被稱爲geomgeom2, mask等,並沒有一個叫number(並且你不能有一個正式的參數,稱爲number,即使引用它,據我所知) 。

運營商的形式參數沒有命名,並且通過位置有效傳遞。您不能通過命名其他參數來跳過一個參數,就像您可以使用具有缺省值的參數的函數/過程一樣。

這意味着你可以在你的調用中調用任何你想要的參數;將呼叫中前三個參數的名稱更改爲隨機的名稱不會阻止它的工作。

這也意味着在通話中命名它們有點毫無意義,但如果你只是想記錄通話,那麼如果你不想引用它,你可以使用其他有意義的名字而不是'數字' 。