2016-05-09 14 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

はパラメータ名 'number'ですか?予約語ではありませんか? – pablomatico

+0

はい。予約語に名前付きパラメータを使用できますか? – Steef

答えて

-1

こんにちは。このRESERVEDキーワード問題を解消する方法は2つあります。

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

これについてy downvoteが分かりますか? –

1

下に示すように、あなたが予約語の問題を回避することができますが、第二に、あなただけの "=>" 使用せずに関数を呼び出すことができます@AvrajitRoyのように二重引用符で囲んであなたの呼び出しでは、すなわち... "NUMBER"=>1) = 'TRUE'...、あなたは実際に多くを達成していません。オラクルはパラメータを名前で参照させていますが、その情報では何も実行していません。

MDSYS.SDO_NNは、機能への直接呼び出しではなく、spatial operatorです。それをバックアップする機能があります。実際にはprtv_idx.nnを呼び出しているMDSYSのスキーマスクリプトから見ることができますが、その関数の仮パラメータの名前は関係ありません。実際にはgeomgeom2maskなどと呼ばれるものがあり、numberという名前はありません(また、numberという仮パラメータを使用することはできません) 。

オペレータへの仮パラメータは、名前が付けられておらず、実際には位置的に渡されます。デフォルト値を持つ引数を持つ関数/プロシージャの場合と同様に、他の名前を付けて引数をスキップすることはできません。

これは、通話に必要なパラメータを呼び出すことができるということです。呼び出し中の最初の3つのパラメータの名前をランダムに変更しても、それは動作を停止しません。

また、コールでそれらの名前を付けることは意味がないことを意味しますが、コールをドキュメント化しようとしているだけであれば、それを引用したくない場合は 'number'ではなく他の意味のある名前を使用できます。

関連する問題