web-dev-qa-db-ja.com

Oracle SQL Developerで変数を使用する方法

以下は、SQL Server 2000で変数を使用する例です。

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

SQL Developerを使用して、Oracleでまったく同じことを複雑さを増すことなく実行したいと思います。それはとても簡単なことのように思えますが、私は簡単な解決策を見つけることができません。どうすればいいの?

99
Nathan

私はバージョン3.2でSQL-Developerを使用しています。他のものは私にはうまくいきませんでした、しかしこれはしました:

define value1 = 'sysdate'

SELECT &&value1 from dual;

また、ここで提示されている最も簡単な方法もあります。

( "define"部分を省略すると、その値を入力するように促されます)

82
Omphaloskopie

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
61
gavenkoa

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;
48
Justin Cave

簡単な答え.

ただし、バインド変数を使用して次のバージョンを実行することで、同様のことを実現できます。

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

SQL Developerで上記のクエリを実行すると、バインド変数EmployeeIDに値を入力するように求められます。

12
Chandu

わかりました。これはちょっとしたハックですが、これはスクリプトではなく単純なクエリで変数を使用する方法です。

WITH
    emplVar AS
    (SELECT 1234 AS id FROM dual)
SELECT
    *
FROM
    employees,
    emplVar
WHERE
    EmployId=emplVar.id;

あなたはどこでもそれを走らせることができます。

8
zpontikas

置換変数については他のところで読むことができます。 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を実行して結果セットを返すことはできません。

7
Baodad

私はあなたのケースで最も簡単な方法はだと思います:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

文字列の値は以下のようになります。

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'
0
Peter

SQL開発者はデフォルトで "ON"でプロパティを定義します。いずれにしても "OFF"の場合は、以下の手順に従ってください。

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

0
Md. Kamruzzaman

これを試してみてください、それはうまくいくでしょう、それはあなたがこのスクリプトを使うことができる手順が不可能であるならば、それはより良い手順を作成します。

with param AS(
SELECT 1234 empid
FROM dual)
 SELECT *
  FROM Employees, param
  WHERE EmployeeID = param.empid;
END;
0

次のクエリを使用してください。

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;
0