以下は、SQL Server 2000で変数を使用する例です。
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
SQL Developerを使用して、Oracleでまったく同じことを複雑さを増すことなく実行したいと思います。それはとても簡単なことのように思えますが、私は簡単な解決策を見つけることができません。どうすればいいの?
私はバージョン3.2でSQL-Developerを使用しています。他のものは私にはうまくいきませんでした、しかしこれはしました:
define value1 = 'sysdate'
SELECT &&value1 from dual;
また、ここで提示されている最も簡単な方法もあります。
( "define"部分を省略すると、その値を入力するように促されます)
SQL-plusには、置換とバインドの2種類の変数があります。
これは置換です(置換変数は、SQL * Plusコマンド・オプションまたはその他のハードコードされたテキストを置き換えることができます)。
define a = 1;
select &a from dual;
undefine a;
これはbindです(バインド変数は、RDBMSで実行されるSQLおよびPL/SQLステートメントのデータ値を格納します。単一の値または完全な結果セットを保持できます)。
var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;
SQL Developerでは置換変数がサポートされていますが、bind :var
構文を使用してクエリを実行すると、(ダイアログボックス内で)バインドを要求されます。
参照:
UPDATE置換変数を使用するには少し注意が必要です。
define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is number
select '&phone' from dual; -- plus is preserved as it is string
SQL * Plusでは、非常によく似たことができます。
SQL> variable v_emp_id number;
SQL> select 1234 into :v_emp_id from dual;
1234
----------
1234
SQL> select *
2 from emp
3 where empno = :v_emp_id;
no rows selected
SQL Developerでは、コロンを先頭に付けたバインド変数をいくつでも含む文を実行すると、値を入力するように求められます。 Alexが指摘しているように、 "Run Script"関数(F5)を使って、Alexが推奨する代替のEXEC構文を使っても同様のことができます。
variable v_count number;
variable v_emp_id number;
exec :v_emp_id := 1234;
exec select count(1) into :v_count from emp;
select *
from emp
where empno = :v_emp_id
exec print :v_count;
簡単な答え.
ただし、バインド変数を使用して次のバージョンを実行することで、同様のことを実現できます。
SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar
SQL Developerで上記のクエリを実行すると、バインド変数EmployeeIDに値を入力するように求められます。
わかりました。これはちょっとしたハックですが、これはスクリプトではなく単純なクエリで変数を使用する方法です。
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
あなたはどこでもそれを走らせることができます。
置換変数については他のところで読むことができます。 SQL Developerでは非常に便利です。しかし、私はSQL Developerでバインド変数を使おうとしています。これが私がすることです:
SET SERVEROUTPUT ON
declare
v_testnum number;
v_teststring varchar2(1000);
begin
v_testnum := 2;
DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
SELECT 36,'hello world'
INTO v_testnum, v_teststring
from dual;
DBMS_OUTPUT.put_line('v_testnum is now ' || v_testnum);
DBMS_OUTPUT.put_line('v_teststring is ' || v_teststring);
end;
SET SERVEROUTPUT ON
を使用すると、テキストをスクリプト出力コンソールに出力できます。
ここで行っていることは正式にはPL/SQLと呼ばれています。私たちは純粋なSQLの世界を去り、Oracleでは異なるエンジンを使用しています。あなたは上記のSELECT
を見ますか? PL/SQLでは、常に変数または参照のいずれかをSELECT ... INTO
する必要があります。 PL/SQLでSELECT
を実行して結果セットを返すことはできません。
私はあなたのケースで最も簡単な方法はだと思います:
DEFINE EmpIDVar = 1234;
SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar
文字列の値は以下のようになります。
DEFINE EmpIDVar = '1234';
SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
SQL開発者はデフォルトで "ON"でプロパティを定義します。いずれにしても "OFF"の場合は、以下の手順に従ってください。
set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';
これを試してみてください、それはうまくいくでしょう、それはあなたがこのスクリプトを使うことができる手順が不可能であるならば、それはより良い手順を作成します。
with param AS(
SELECT 1234 empid
FROM dual)
SELECT *
FROM Employees, param
WHERE EmployeeID = param.empid;
END;
次のクエリを使用してください。
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;