Oracle SQL Developerで変数を使用するにはどうすればよいですか?


116

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

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

さらに複雑な作業をせずに、SQL Developerを使用してOracleでまったく同じことを実行したいと考えています。とても簡単なことのようですが、簡単な解決策が見つかりません。どうすればできますか?


ストアドプロシージャまたはスクリプトとして?EmpIDVarの値をハードコーディングしている場合、なぜ変数を使用するのですか?
クロシュ

回答:


95

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

define value1 = 'sysdate'

SELECT &&value1 from dual;

また、これは、ここで提示した最も洗練された方法です。

( "define" -partを省略すると、その値の入力を求められます)


12
&& value1を次のような文字列値と比較する場合:&& value1 = 'Some string' && value1は次のように一重引用符で囲む必要があります: '&& value1' = 'Some string'
Ryan E

1
SQL Developerでは、DEFINEによって定義された置換変数は、クエリの実行間で永続的なようです。変数値を変更しても、実行時にDEFINE行を明示的に強調表示しないと、以前の値が残ります。(これはダブル&&のせいですか?)
Baodad 2014年

9
セクション2.4のこのページでは、単一のアンパサンド(&)と二重のアンパサンド(&&)の違いについて説明しています
Baodad

1
Microsoft SQL Server Management Studioで変数を使用してクエリを操作するのに慣れている人にとっては、これが最良の答えです。ただし、実行する前にクエリ全体を強調表示することに慣れる必要があるかもしれません。
Baodad 2014年

この答えは、SQL-Developer 2.1で私に役立つ解決策でした。これは間違いなく、ユーザーがクエリの上の値を変更し、クエリ自体を編集する必要がない方法を実装する最も簡単な方法です。
YonkeyDonk64 14

74

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

2
SQL Developer(4.1.1.19)でバインドを試しましたが、それも機能しています。私はケースを意味しないvar xexec :x、何もプロンプト。
Betlista 2016年

50

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;

14
「ステートメントを実行」ではなく「スクリプトを実行」(F5)すると、バインド変数の入力を求められません。しかし、select...into(ORA-01006)は気に入らないようなので、exec :v_emp_id := 1234;代わりに行う必要があります。
アレックスプール

@アレックス-いいね!私はあきらめて、SQL Developerが常にバインド変数値の入力を求めていると想定しました。私はあなたの提案を私の答えに組み込んだ。
Justin Cave

1
@Nathan:v_emp_idでパッケージを実行する場合は、refcursorにもバインド変数を使用できます。私が持っていた同様の質問に対するアレックスの回答の一番下を参照してください
コンラッドフリックス

2
@AlexPooleは、クエリ結果ウィンドウに出力を送信する方法はありますか?私の仕事では、クエリを実行してExcelファイルにエクスポートします。
tp9

13

これは少しハックですが、これはスクリプトではなく、単純なクエリで変数を使用する方法です。

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

どこでも実行できます。


これをselectの代わりにUPDATEで使用する方法はありますか?
ロンジェンセン-私たちは全員モニカです。

12

簡単な答えNO。

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

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

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


8

置換変数については、他の場所で読むことができます。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のいずれかを使用する必要があります。SELECTPL / SQLで結果セットを返すことはできません。


2

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

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

文字列値の場合は次のようになります。

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

次のクエリを使用します。

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

エラーが返されました "PLS-00428 INTO句がこのSELECTステートメントで予期されています"
Thuntter

0

これを試してみてください。機能します。手順を作成することをお勧めします。手順が不可能な場合は、このスクリプトを使用できます。

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

0

SQL開発者では、デフォルトでプロパティを "ON"に定義します。いずれの場合も「オフ」の場合は、以下の手順を使用します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.