2016-05-09 17 views
0

Wie kann ich Schlüsselwörter mit Oracle benannter Parameter Syntax verwenden? Im Folgenden gibt mir ‚ORA-00936: fehlenden Ausdruck‘ wegen des ‚number'-Arguments:Oracle benannte Parameter

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; 

Wenn ich es ohne benannte Parameter ausführen es ist in Ordnung.

Dank, Steef

+0

ist der Parametername 'Nummer'? ist es nicht ein reserviertes Wort? – pablomatico

+0

Ja. Kann ich benannte Parameter mit reservierten Wörtern verwenden? – Steef

Antwort

-1

Hallo wie mentined in Ihnen hinterfragen. Es gibt zwei Möglichkeiten, wie Sie dieses RESERVED-Schlüsselwort ISSUE eliminieren können.

1) Verwenden Sie "", um ein RESERVED-Schlüsselwort für den Aufruf zu verwenden. Aber denken Sie daran, dass dies keine gute Programmierpraxis ist. Eg>

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) Zweitens können Sie nur die Funktion aufrufen, ohne "=>", wie unten

Eg gezeigt>

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

Darf ich dafür einen Kommentar abgeben? –

1

Obwohl Sie rund um das reservierte Wort Problem bekommen In Ihrem Anruf, indem Sie den Namen in doppelte Anführungszeichen einschließen, wie @ AvrajitRoy vorgeschlagen, dh ... "NUMBER"=>1) = 'TRUE'..., erreichen Sie nicht wirklich viel. Oracle lässt Sie zwar namentlich auf die Parameter verweisen, tut aber nichts mit diesen Informationen.

MDSYS.SDO_NN ist ein spatial operator, kein direkter Aufruf einer Funktion. Es gibt eine Funktion, die es sichert - Sie können aus den Schemaskripten für MDSYS sehen, dass es tatsächlich prtv_idx.nn aufruft - aber die Namen der formalen Parameter dieser Funktion sind nicht relevant. Mit etwas graben können Sie sehen, dass diese tatsächlich geom, , mask usw. genannt werden, und es gibt keinen einen number genannt (und Sie können einen formalen Parameter number nicht haben, sogar zitierend es, so weit ich erzählen kann) .

Die formalen Parameter für den Operator sind nicht benannt und werden effektiv positionell übergeben. Sie können ein Argument nicht überspringen, indem Sie die anderen benennen, wie dies bei einer Funktion/Prozedur mit Argumenten der Fall ist, die Standardwerte haben.

Das bedeutet, dass Sie die Parameter in Ihrem Anruf beliebig aufrufen können; Ändern Sie die Namen der ersten drei Parameter in Ihrem Anruf zu etwas zufällig wird es nicht aufhören zu arbeiten.

Es bedeutet auch, sie in den Anruf zu nennen ist ein wenig sinnlos, aber wenn Sie nur versuchen, den Anruf zu dokumentieren, dann können Sie einen anderen aussagekräftigen Namen als "Nummer" verwenden, wenn Sie es nicht zitieren möchten .

Verwandte Themen