Oracle SQL Developer'da değişkenleri nasıl kullanırım?


116

Aşağıda, SQL Server 2000'de değişkenlerin kullanımına bir örnek verilmiştir.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Ek karmaşıklık olmadan SQL Developer kullanarak Oracle'da tam olarak aynı şeyi yapmak istiyorum. Yapılacak çok basit bir şey gibi görünüyor, ancak basit bir çözüm bulamıyorum. Nasıl yapabilirim?


Depolanan prosedür olarak mı yoksa komut dosyası olarak mı? EmpIDVar değerini kodluyorsanız, neden bir değişken kullanasınız?
kurosch

Yanıtlar:


95

Sürüm 3.2'de SQL-Developer'ı kullanıyorum. Diğer şeyler benim için işe yaramadı ama bu işe yaradı:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Ayrıca, şimdiye kadar burada sunulan en şık yol.

("Tanımla" bölümünü atlarsanız, bu değeri girmeniz istenir)


12
&& değer1'i, && değer1 = 'Bazı dizeler' gibi bir dize değeriyle karşılaştırıyorsanız, o zaman && değer1'in şu şekilde tek tırnak içine alınması gerekir: '&& değer1' = 'Bazı dizeler'
Ryan E

1
SQL Developer'da DEFINE tarafından tanımlanan ikame değişkenleri, sorgu yürütmeleri arasında kalıcı görünmektedir. Değişken değerini değiştirirsem, ancak yürütme sırasında DEFINE satırını açıkça vurgulamazsam, önceki değer kalır. (Çift && yüzünden mi?)
Baodad

9
Bölüm
2.4'teki

1
Microsoft SQL Server Management Studio'da değişkenlerle sorgularla çalışmaya alışkın olanlar için bu en iyi cevaptır. Yine de, çalıştırmadan önce tüm sorguyu vurgulamaya alışmamız gerekebilir.
Baodad

Bu cevap, SQL-Developer 2.1'de benim için çalışan çözümdü. Kullanıcının sorgunun üzerindeki bir değeri değiştirmesi ve sorgunun kendisini düzenlemesi gerekmemesi için bir yol uygulamak kesinlikle en basit yöntemdir.
YonkeyDonk64

74

SQL-plus'ta iki tür değişken vardır: değiştirme ve bağlama.

Bu, değiştirmedir (ikame değişkenleri, SQL * Plus komut seçeneklerinin veya diğer sabit kodlu metinlerin yerini alabilir):

define a = 1;
select &a from dual;
undefine a;

Bu bağlayıcı (bağ değişkenleri, RDBMS'de yürütülen SQL ve PL / SQL ifadeleri için veri değerlerini saklar; tek değerleri veya tam sonuç kümelerini tutabilirler):

var x number;
exec :x := 10;
select :x from dual;
exec select count(*) into :x from dual;
exec print x;

SQL Developer ikame değişkenlerini destekler, ancak bağlama ile bir sorgu yürüttüğünüzde :var sözdizimi için sorulur (bir iletişim kutusunda).

Referans:

UPDATE ikame değişkenlerinin kullanımı biraz zor, bakın:

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
Bind'i SQL Developer'da (4.1.1.19) denedim ve o da çalışıyor. Demek istediğim, var xve ile olan durum exec :x, istemi yok.
Betlista

50

SQL * Plus'ta çok benzer bir şey yapabilirsiniz

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'da, herhangi bir sayıda bağ değişkeni içeren bir deyim çalıştırırsanız (iki nokta üst üste ile), değerleri girmeniz istenir. Alex'in belirttiği gibi, Alex'in önerdiği alternatif EXEC sözdizimi ile "Komut Dosyası Çalıştır" işlevini (F5) kullanarak da benzer bir şey yapabilirsiniz.

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
Eğer 'çalıştırma deyimi' yerine 'betik çalıştırırsanız' (F5), o zaman bağlama değişkenlerini sormaz. Ancak select...into(ORA-01006) ' dan hoşlanmıyor gibi görünüyor , bu yüzden exec :v_emp_id := 1234;bunun yerine yapmanız gerekir .
Alex Poole

@Alex - Güzel! Sadece pes ettim ve SQL Developer'ın her zaman değişken değerleri bağla istediğini varsaydım. Önerilerinizi cevabıma dahil ettim.
Justin Cave

1
@Nathan: v_emp_id ile bir paket yürütmek istiyorsanız, refcursors için bağlama değişkenlerini de kullanabilirsiniz. Alex'in sahip olduğum benzer bir soruya verdiği cevabın altına bakın
Conrad Frix

2
@AlexPoole, çıktıyı Sorgu Sonucu penceresine göndermenin bir yolu var mı? İşimde Excel dosyalarına aktarmak için sorgular çalıştırıyorum.
tp9

13

Tamam, bunun bir hack olduğunu biliyorum ama bu, bir komut dosyası değil, basit bir sorguda bir değişken kullanmanın bir yoludur:

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

Her yerde çalıştırmalısın.


Bunu seçmek yerine UPDATE ile kullanmanın bir yolu var mı?
Ron Jensen - Hepimiz Monica'yız

12

Basit cevap HAYIR.

Ancak, aşağıdaki sürümü bağlama değişkenlerini kullanarak çalıştırarak benzer bir şey elde edebilirsiniz:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Yukarıdaki sorguyu SQL Developer'da çalıştırdığınızda, EmployeeID bağlama değişkeni için değer girmeniz istenir.


8

İkame değişkenleri hakkında başka bir yerde okuyabilirsiniz; SQL Developer'da oldukça kullanışlıdırlar. Ancak SQL Developer'da bind değişkenlerini kullanmaya çalışıyorum. Bu benim işim:

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 metnin komut dosyası çıktı konsoluna yazdırılabilmesini sağlar.

Burada yaptığımız şeyin resmi olarak PL / SQL olduğuna inanıyorum. Saf SQL bölgesini terk ettik ve Oracle'da farklı bir motor kullanıyoruz. SELECTYukarıdakileri görüyor musunuz? PL / SQL'de her zaman SELECT ... INTObir değişkene veya bir refcursor'a ihtiyacınız vardır. Öylece gidip SELECTve PL / SQL bir sonuç kümesi döndürür.


2

Bence senin durumunda en kolay yol:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Dize değerleri için şöyle olacaktır:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

Sonraki sorguyu kullanın:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

hata döndürdü "PLS-00428 bu SELECT deyiminde bir INTO yan tümcesi bekleniyor"
Thundter

0

Bunu deneyin, işe yarayacak, bir prosedür oluşturmak daha iyi, prosedür mümkün değilse bu betiği kullanabilirsiniz.

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

0

Sql geliştiricisinde özellikleri varsayılan olarak "AÇIK" olarak tanımlar. Herhangi bir durumda "KAPALI" ise, aşağıdaki adımları kullanın.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.