web-dev-qa-db-ja.com

Oracle Databaseで「SET DEFINE OFF」を使用するタイミングまたは理由

Oracleでスクリプトを見ていますが、認識できないものが表示されます

REM INSERTING into database1."Users"
 SET DEFINE OFF;
Insert into database1."Users" ("id","right") values ('1','R');

「set define off」に関するドキュメントを探しています。文字通り「コマンドの解析を無効にして、置換変数をその値に置き換えます」と書いています。

私は彼らが言いたいことを本当に理解していません。

誰も私を助けることができますか?

51

デフォルトでは、SQL Plusは「&」を置換文字列を開始する特殊文字として扱います。これは、他の理由で「&」を含むスクリプトを実行するときに問題を引き起こす可能性があります。

SQL> insert into customers (customer_name) values ('Marks & Spencers Ltd');
Enter value for spencers: 
old   1: insert into customers (customer_name) values ('Marks & Spencers Ltd')
new   1: insert into customers (customer_name) values ('Marks  Ltd')

1 row created.

SQL> select customer_name from customers;

CUSTOMER_NAME
------------------------------
Marks  Ltd

スクリプトに '&'文字を含むデータが含まれている(または含まれている)ことがわかっていて、上記のような置換動作が必要ない場合は、set define offを使用してスクリプトの実行中に動作をオフにします。

SQL> set define off
SQL> insert into customers (customer_name) values ('Marks & Spencers Ltd');

1 row created.

SQL> select customer_name from customers;

CUSTOMER_NAME
------------------------------
Marks & Spencers Ltd

スクリプトの最後にset define onを追加して、デフォルトの動作に戻すことができます。

82
Tony Andrews

以下に例を示します。

SQL> set define off;
SQL> select * from dual where dummy='&var';

no rows selected

SQL> set define on
SQL> /
Enter value for var: X
old   1: select * from dual where dummy='&var'
new   1: select * from dual where dummy='X'

D
-
X

set define offを使用して、&var値を持つ行を取得し、ユーザーに値を入力するように促し、&varを入力した値(この場合はX)に置き換えました。