2017-04-01 5 views
1

私は、次のPL/SQLブロックに書いた:変数名が "'xxx'を宣言する必要がある原因となる値で置き換えられるのはなぜですか?

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; 
/

をそして私は、次のコンパイラの出力を得た:

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 

変数「名前」が「dhia」その値に置き換え、なぜ私の質問がありますそのエラーの原因となるスクリプトで、それを修正する方法は?

あなたがこの方法をあなたの変数を使用するべきではありません

答えて

0

、予想される動作は、その値によってそれらを交換することで、あなたの変数があなたの列名と同じであってはならない、次のことを試してください。

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

実際には、これは私が最初に思ったのと全く同じエラーメッセージを与えますが、変数名が問題とは何の関係もないように見えます。どうにかして質問に変わります。 –

+0

@DhiaHassen上記の答えの中に挿入クエリを実行してコマンドを実行しますか? –

+0

はい私は上記のあなたのコードをコピーして貼り付け、私は同じエラーメッセージを持っています –

0

これは、出力はコンパイラではない、それは、SQL * Plusの出力です:

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

&v_nameは、* SQLを意味プラス盲目的前にリテラルテキストdhia&v_nameを置き換えsubstitution variable(も定義変数として知られている)であり、コンパイルと実行のためにデータベースに送信します。上記のnew 6行は、このテキスト置換後のコードの外観を示しています。表示されているように、v_name := dhia;は、dhiaという名前のスコープに別の変数または関数がある場合にのみ有効です。テキスト値のために置換変数を使用したい場合は、それを引用する必要があります。

v_name := '&v_name'; 

また、これはあなたのdbms_outputコマンドは彼らが多少無駄になり、置換、後まで実行されないことを意味します。ユーザーからの入力を取得する場合は、PL/SQLブロックの開始前にacceptコマンドを使用します。

例では、EMP5テーブルが存在しない場合、insertコマンドで存在しないテーブルへの参照が原因でブロックがコンパイルされません。存在していればexecute immediateは失敗します。別のステップでテーブルを作成するか、テーブルへのすべての参照にexecute immediateを使用して、すでに存在するケースを処理する必要があります。

関連する問題