2016-05-09 79 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,即使引用它,据我所知) 。

运营商的形式参数没有命名,并且通过位置有效传递。您不能通过命名其他参数来跳过一个参数,就像您可以使用具有缺省值的参数的函数/过程一样。

这意味着你可以在你的调用中调用任何你想要的参数;将呼叫中前三个参数的名称更改为随机的名称不会阻止它的工作。

这也意味着在通话中命名它们有点毫无意义,但如果你只是想记录通话,那么如果你不想引用它,你可以使用其他有意义的名字而不是'数字' 。