Oracle命名参数

时间:2016-05-09 11:23:28

标签: plsql oracle11g oracle-spatial

如何在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

2 个答案:

答案 0 :(得分:1)

虽然您可以通过将名称括在@AvrajitRoy建议的双引号中来解决您的通话中的保留字问题,即... "NUMBER"=>1) = 'TRUE'...,但实际上并没有实现太多。 Oracle允许您按名称引用参数,但它没有对该信息执行任何操作。

MDSYS.SDO_NNspatial operator,不是对函数的直接调用。有一个功能支持它 - 您可以从MDSYS的模式脚本中看到它实际上正在调用prtv_idx.nn - 但该函数的形式参数的名称不相关。通过一些挖掘,你可以看到那些实际上被称为geomgeom2mask等,并且没有一个名为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;