以下は、SQL Server 2000での変数の使用例です。
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
さらに複雑な作業をせずに、SQL Developerを使用してOracleでまったく同じことを実行したいと考えています。とても簡単なことのようですが、簡単な解決策が見つかりません。どうすればできますか?
以下は、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" -partを省略すると、その値の入力を求められます)
SQL-plusの変数には、置換とバインドの2つのタイプがあります。
これは置換です(置換変数は、SQL * Plusコマンドオプションまたは他のハードコードされたテキストを置き換えることができます)。
define a = 1;
select &a from dual;
undefine a;
これはバインドです(バインド変数は、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は置換変数をサポートしていますが、バインド:var
構文を使用してクエリを実行すると、(ダイアログボックスで)バインドを求めるプロンプトが表示されます。
参照:
UPDATE 置換変数を使用するには少し注意が必要です。
define phone = '+38097666666';
select &phone from dual; -- plus is stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string
var x
とexec :x
、何もプロンプト。
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が指摘するように、Alexが提案する代替EXEC構文で「スクリプトの実行」機能(F5)を使用して、同様のことを行うこともできます。
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...into
(ORA-01006)は気に入らないようなので、exec :v_emp_id := 1234;
代わりに行う必要があります。
これは少しハックですが、これはスクリプトではなく、単純なクエリで変数を使用する方法です。
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
変数またはrefcursorのいずれかを使用する必要があります。SELECT
PL / SQLで結果セットを返すことはできません。
次のクエリを使用します。
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;
これを試してみてください。機能します。手順を作成することをお勧めします。手順が不可能な場合は、このスクリプトを使用できます。
with param AS(
SELECT 1234 empid
FROM dual)
SELECT *
FROM Employees, param
WHERE EmployeeID = param.empid;
END;