如何在Oracle命名参数语法中使用关键字?以下为我提供了ORA-00936:表达式缺失'因为' -argument:
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 :(得分:1)
虽然您可以通过将名称括在@AvrajitRoy建议的双引号中来解决您的通话中的保留字问题,即... "NUMBER"=>1) = 'TRUE'...
,但实际上并没有实现太多。 Oracle允许您按名称引用参数,但它没有对该信息执行任何操作。
MDSYS.SDO_NN
是spatial operator,不是对函数的直接调用。有一个功能支持它 - 您可以从MDSYS的模式脚本中看到它实际上正在调用prtv_idx.nn
- 但该函数的形式参数的名称不相关。通过一些挖掘,你可以看到那些实际上被称为geom
,geom2
,mask
等,并且没有一个名为number
(你不能拥有形式参数称为number
,甚至引用它,据我所知。)
运算符的形式参数未命名,并且有效地通过位置传递。您不能通过命名其他参数来跳过参数,就像使用带有默认值的参数的函数/过程一样。
这意味着您可以在通话中调用任何您想要的参数;将调用中前三个参数的名称更改为随机的名称不会阻止它正常工作。
这也意味着在通话中命名它们有点毫无意义,但如果您只是想记录通话,那么如果您不想引用它,您可以使用其他有意义的名称而不是“数字”。
答案 1 :(得分:-1)
您好问题在于你的问题。有两种方法可以消除此RESERVED关键字问题。
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;