Bagaimana cara menggunakan variabel di Oracle SQL Developer?


116

Di bawah ini adalah contoh penggunaan variabel di SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Saya ingin melakukan hal yang sama persis di Oracle menggunakan SQL Developer tanpa kerumitan tambahan. Sepertinya hal yang sangat sederhana untuk dilakukan, tetapi saya tidak dapat menemukan solusi yang sederhana. Bagaimana saya bisa melakukannya?


Sebagai prosedur tersimpan atau sebagai skrip? Jika Anda melakukan hardcode nilai untuk EmpIDVar, mengapa menggunakan variabel?
kurosch

Jawaban:


95

Saya menggunakan SQL-Developer di Versi 3.2. Hal-hal lain tidak berhasil untuk saya, tetapi ini berhasil:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Juga cara paling apik yang disajikan di sini.

(Jika Anda menghilangkan bagian "definisikan", Anda akan diminta memasukkan nilai itu)


12
Jika membandingkan && value1 dengan nilai string seperti: && value1 = 'Some string' maka && value1 perlu dibungkus dalam tanda kutip tunggal seperti: '&& value1' = 'Some string'
Ryan E

1
Dalam SQL Developer, variabel substitusi yang ditentukan oleh DEFINE tampaknya tetap ada di antara eksekusi kueri. Jika saya mengubah nilai variabel, tetapi tidak secara eksplisit menyorot baris DEFINE saat menjalankan, nilai sebelumnya tetap ada. (Apakah ini karena
penggandaan

9
Halaman ini di bagian 2.4 membahas tentang perbedaan antara ampersand tunggal (&) dan ampersand ganda (&&)
Baodad

1
Bagi kita yang terbiasa bekerja dengan kueri dengan variabel di Microsoft SQL Server Management Studio, ini adalah jawaban terbaik. Kami mungkin perlu membiasakan diri untuk menyorot seluruh kueri sebelum menjalankannya.
Baodad

Jawaban ini adalah solusi yang berhasil untuk saya di SQL-Developer 2.1. Ini jelas merupakan metode paling mudah untuk menerapkan cara bagi pengguna untuk mengubah nilai di atas kueri dan tidak harus mengedit kueri itu sendiri.
YonkeyDonk64

74

Ada dua jenis variabel dalam SQL-plus: substitusi dan bind.

Ini adalah substitusi (variabel substitusi dapat menggantikan opsi perintah SQL * Plus atau teks hard-code lainnya):

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

Ini bind (variabel bind menyimpan nilai data untuk pernyataan SQL dan PL / SQL yang dieksekusi di RDBMS; mereka dapat menyimpan nilai tunggal atau kumpulan hasil lengkap):

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

Pengembang SQL mendukung variabel substitusi, tetapi ketika Anda menjalankan kueri dengan :varsintaks mengikat Anda diminta untuk mengikat (dalam kotak dialog).

Referensi:

Variabel substitusi UPDATE agak rumit untuk digunakan, lihat:

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
Saya mencoba mengikat di SQL Developer (4.1.1.19) dan berfungsi juga. Maksud saya kasus dengan var xdan exec :x, tidak ada prompt.
Betlista

50

Di SQL * Plus, Anda dapat melakukan sesuatu yang sangat mirip

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

Di SQL Developer, jika Anda menjalankan pernyataan yang memiliki sejumlah variabel mengikat (diawali dengan titik dua), Anda akan diminta untuk memasukkan nilai. Seperti yang ditunjukkan Alex, Anda juga dapat melakukan sesuatu yang serupa menggunakan fungsi "Run Script" (F5) dengan sintaks EXEC alternatif yang disarankan Alex.

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
jika Anda 'menjalankan script' (F5) daripada 'run statement' maka itu tidak akan meminta variabel bind. Tapi sepertinya tidak menyukai select...into(ORA-01006), jadi Anda harus melakukannya exec :v_emp_id := 1234;.
Alex Poole

@Alex - Bagus! Saya baru saja menyerah dan berasumsi bahwa SQL Developer selalu meminta nilai variabel bind. Saya memasukkan saran Anda ke dalam jawaban saya.
Gua Justin

1
@Nathan jika Anda ingin menjalankan paket dengan: v_emp_id, Anda juga dapat menggunakan variabel bind untuk refcursor. Lihat bagian bawah jawaban Alex untuk pertanyaan serupa yang saya miliki
Conrad Frix

2
@AlexPoole apakah ada cara untuk mengirim output ke jendela Hasil Kueri? Dalam pekerjaan saya, saya menjalankan kueri untuk mengekspor ke file Excel.
tp9

13

Ok saya tahu ini sedikit retasan tetapi ini adalah cara untuk menggunakan variabel dalam kueri sederhana, bukan skrip:

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

Anda bisa menjalankannya di mana-mana.


Apakah ada cara untuk menggunakan ini dengan UPDATE daripada memilih?
Ron Jensen - Kita semua adalah Monica

12

Jawaban sederhana TIDAK.

Namun Anda dapat mencapai sesuatu yang serupa dengan menjalankan versi berikut menggunakan variabel bind:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Setelah Anda menjalankan kueri di atas di SQL Developer, Anda akan diminta untuk memasukkan nilai untuk variabel bind EmployeeID.


8

Anda dapat membaca di tempat lain tentang variabel substitusi; mereka cukup berguna di SQL Developer. Tapi saya telah mencoba menggunakan variabel bind di SQL Developer. Inilah yang saya lakukan:

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 membuatnya jadi teks dapat dicetak ke konsol keluaran skrip.

Saya yakin apa yang kami lakukan di sini secara resmi disebut PL / SQL. Kami telah meninggalkan tanah SQL murni dan menggunakan mesin yang berbeda di Oracle. Anda lihat di SELECTatas? Dalam PL / SQL Anda selalu harus SELECT ... INTOvariabel atau refcursor. Anda tidak bisa begitu saja SELECTdan mengembalikan hasil yang ditetapkan dalam PL / SQL.


2

Saya pikir cara termudah dalam kasus Anda adalah:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Untuk nilai stringnya akan seperti ini:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

Gunakan kueri berikutnya:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

kesalahan mengembalikan "PLS-00428 klausa INTO diharapkan dalam pernyataan SELECT ini"
Gemuruh

0

Coba ini akan berhasil, lebih baik buat prosedur, jika prosedur tidak memungkinkan Anda dapat menggunakan skrip ini.

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

0

Dalam pengembang sql tentukan properti secara default "ON". Jika kasusnya "OFF", gunakan langkah-langkah di bawah ini.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.