2017-04-01 3 views
1

Ich schrieb den folgenden PL/SQL-Block:Warum wird der Variablenname durch seinen Wert ersetzt, der bewirkt, dass '' xxx 'als Fehler deklariert werden sollte?

declare 
    v_name varchar2(20); 
    v_sal integer; 
begin 
    EXECUTE IMMEDIATE ('CREATE TABLE EMP5 (name varchar2(20),sal integer,primary key(name))'); 
    dbms_output.put_line('Enter name : '); 
    v_name:=&v_name; 
    dbms_output.put_line('salary : '); 
    v_sal :=&v_sal; 
    insert into emp5 (name,sal) values (v_name,v_sal); 
end; 
/

Und dann bekam ich die folgende Compiler-Ausgabe:

Enter a valeur for v_name : dhia 
old 6 : v_name:=&v_name; 
new 6 : v_name:=dhia; 
Enter a valeur for v_sal : 10 
old 8 : v_sal :=v_&sal; 
new 8 : v_sal :=10; 
v_name:=dhia; 
     * 
ERREUR at line 6 : 
ORA-06550: line 6, colon 7 : 
PLS-00201: the identifier 'DHIA' should be declared 
ORA-06550: line 6, colon 1 : 
PL/SQL: Statement ignored 
ORA-06550: line9, colon 13 : 
PL/SQL: ORA-00942: table or view does not exist 
ORA-06550: line 9, colon 1 : 
PL/SQL: SQL Statement ignored 

Meine Frage ist, warum der Variable 'name' durch seinen Wert 'dhia' ersetzt in dem Skript, das diesen Fehler verursacht, und wie man es repariert?

Antwort

0

Sie sollten nicht Ihre Variablen auf diese Weise verwenden, ist das erwartete Verhalten sie durch ihre Werte zu ersetzen, sollten Sie Ihre Variablen nicht die gleiche wie Ihre Spaltennamen sein, versuchen Sie bitte folgendes:

declare 
varName varchar2(20); 
varSal integer; 
sql_stmt varchar2(200); 
begin 
EXECUTE IMMEDIATE ('CREATE TABLE EMP5 (name varchar2(20),sal integer,primary key(name))'); 
dbms_output.put_line('Enter name : '); 
varName :=&varName; 
dbms_output.put_line('salary : '); 
varSal :=&varSal; 
sql_stmt := 'INSERT INTO EMP5 VALUES (:1, :2)'; 
EXECUTE IMMEDIATE sql_stmt USING varName, varSal; 
end; 
/
+0

Nein eigentlich, dies gibt die exakt gleiche Fehler msg, das ist, was ich zuerst dachte auch, aber es sieht aus wie der Variablenname nichts mit dem Problem zu tun haben, irgendwie krank ändern Sie es in der Frage –

+0

@DhiaHassen haben Sie versucht EXECUTE COMMAND mit der INSERT-Abfrage als was in der obigen Antwort? –

+0

Ja, ich habe Ihren Code oben kopiert und eingefügt, und ich habe den gleichen Fehler erhalten. Msg –

0

Dies ist nicht ausgegeben Compiler ist es SQL * plus-Ausgang:

Enter a valeur for v_name : dhia 
old 6 : v_name:=&v_name; 
new 6 : v_name:=dhia; 

&v_name ist ein substitution variable (auch als Variable definiert bekannt), die SQL * plus-Mittel ersetzt blind &v_name mit dem Literaltext dhia vor Senden an die Datenbank zum Kompilieren und Ausführen. Die obige Zeile new 6 zeigt Ihnen, wie Ihr Code nach dieser Textersetzung aussieht. Wie Sie sehen können, wäre v_name := dhia; nur gültig, wenn es eine andere Variable oder Funktion im Bereich namens dhia gäbe. Wenn Sie eine Substitutionsvariable für einen Textwert verwenden möchten, müssen Sie es zitieren:

v_name := '&v_name'; 

Dies bedeutet auch Ihre dbms_output Befehle werden erst nach der Substitution durchgeführt werden, die ihnen etwas nutzlos macht. Wenn Sie Eingaben vom Benutzer erfassen möchten, verwenden Sie vor dem Start des PL/SQL-Blocks den Befehl accept.

Ein anderes Problem in Ihrem Beispiel ist, dass, wenn die EMP5 Tabelle nicht existiert, der Block nicht kompiliert wird, weil der Verweis auf eine nicht existierende Tabelle in insert Befehl; aber wenn es existiert, wird Ihr execute immediate fehlschlagen. Sie müssen die Tabelle entweder in einem separaten Schritt erstellen oder für alle Verweise auf verwenden und den Fall behandeln, in dem sie bereits vorhanden ist.

Verwandte Themen