2017-12-23 8 views
0

Warum kann der folgende Code nicht mit einem Fehler kompiliert werden? Ich habe versucht, den Block jedes Mal drei Mal mit verschiedenen Eingaben a, 1 und NULL auszuführen.Ungültige Bindevariable: Warum findet die Bindung nicht in der gespeicherten Prozedur statt?

Name Null Type   
------- ---- ------------ 
col_nam  VARCHAR2(20) 

Compile Log:

Error: PLS-00049: bad bind variable 'x' 

Code:

create or replace function ret_bool return boolean is 
num_var number; 
begin 
    select col_nam into num_var from ex04011601 where col_nam=:x; //statement 1 
    return true; 
end; 
/
+2

Es spielt keine‘ Es ist sinnvoll, dass eine Bind-Variable im Body einer Funktion angezeigt wird, da die Sprache keinen Mechanismus besitzt, um sie mit einem Wert zu versorgen. Wie würdest du es benutzen? –

Antwort

0

Sie müssen in X als Parameter an die Funktion zu übergeben:

create or replace function ret_bool(X IN VARCHAR2) 
return boolean is 
num_var number; 
begin 
    select col_nam into num_var from ex04011601 where col_nam= X; 
    return true; 
end; 
+0

Ich versuche nicht, den Block zu trainieren. Meine Zweifel hier ist, warum konnte ich nicht hier eine Bind-Variable verwenden. –

+2

Ich erklärte warum. Sie erstellen eine PL/SQL-Funktion. Diese Funktion wird in der Datenbank ausgeführt. Es hat keine Ahnung von externen Variablenwerten. – OldProgrammer

+0

Also ich denke, auch wenn Sie Bindevariable bei Prozedurspezifikation 'create or replace proc Prozedur (: n1 in out number) 'ist es immer noch einen Verweis Verweis rechts haben? –

0

Da in diesem Fall Die Host-Variablen können nirgendwo in der Datenbank referenziert werden Definition einer PL/SQL-Prozedur.

.... Für jeden Platzhalter in der SQL-Anweisung oder PL/SQL-Block, müssen Sie eine OCI-Routine aufrufen, die die Adresse einer Variablen in Ihrem Programm auf den Platzhalter ...

bindet

Hier hat der Platzhalter während der Kompilierung keine Variable (mit Speicher belegt), an deren Adresse er gebunden werden kann.

0

"Ich denke, selbst wenn die Verwendung Bind-Variable auf Prozedur Spezifikation procedure proc(:n1 in out number)..."

An einem gewissen Punkt der Benutzer einen Istwert zur Verfügung stellen muss. Dies ist der Ort, an dem eine Bind-Variable verwendet werden soll.

Lassen Sie uns Ihre Funktion übernehmen und einen Parameter als PL/SQL verwenden:

create or replace function ret_bool (p_arg in number) 
return boolean is 
    num_var number; 
begin 
    select col_nam into num_var 
    from ex04011601 
    where col_nam= p_arg; 
    return true; 
end; 
/

Der richtige Weg, um eine Bindevariable zu verwenden, wenn Sie die Funktion rufen :

EXEC SQL EXECUTE 
BEGIN 
    :x := ret_bool(:n); 
    ... 
Verwandte Themen