Làm cách nào để sử dụng các biến trong Oracle SQL Developer?


116

Dưới đây là một ví dụ về việc sử dụng các biến trong SQL Server 2000.

DECLARE @EmpIDVar INT

SET @EmpIDVar = 1234

SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar

Tôi muốn làm điều tương tự trong Oracle bằng cách sử dụng SQL Developer mà không có thêm sự phức tạp. Nó có vẻ như là một việc rất đơn giản để làm, nhưng tôi không thể tìm thấy một giải pháp đơn giản. Tôi làm nó như thế nào?


Là một thủ tục được lưu trữ hay là một tập lệnh? Nếu bạn đang mã hóa cứng giá trị cho EmpIDVar, tại sao lại sử dụng một biến?
kurosch

Câu trả lời:


95

Tôi đang sử dụng SQL-Developer trong Phiên bản 3.2. Những thứ khác không hoạt động với tôi, nhưng điều này đã làm:

define value1 = 'sysdate'

SELECT &&value1 from dual;

Ngoài ra, đó là cách khéo léo nhất được trình bày ở đây.

(Nếu bạn bỏ qua phần "xác định", bạn sẽ được nhắc nhập giá trị đó)


12
Nếu so sánh && value1 với một giá trị chuỗi như: && value1 = 'Một số chuỗi' thì && value1 cần được đặt trong các dấu ngoặc kép như: '&& value1' = 'Một số chuỗi'
Ryan E

1
Trong SQL Developer, các biến thay thế được xác định bởi DEFINE dường như liên tục giữa các lần thực thi truy vấn. Nếu tôi thay đổi giá trị biến, nhưng không đánh dấu rõ ràng dòng DEFINE khi thực thi, giá trị trước đó vẫn còn. (Đây có phải là do đôi &&?)
Baodad

9
Trang này trong phần 2.4 nói về sự khác biệt giữa ký hiệu đơn và (&) và ký hiệu kép và (&&)
Baodad

1
Đối với những người trong chúng ta đã từng làm việc với các truy vấn có biến trong Microsoft SQL Server Management Studio, đây là câu trả lời tốt nhất. Tuy nhiên, chúng ta có thể cần phải làm quen với việc đánh dấu toàn bộ truy vấn trước khi thực thi.
Baodad

Câu trả lời này là giải pháp phù hợp với tôi trong SQL-Developer 2.1. Đây chắc chắn là phương pháp đơn giản nhất để triển khai cách để người dùng thay đổi giá trị phía trên truy vấn và không phải chỉnh sửa chính truy vấn.
YonkeyDonk64

74

Có hai loại biến trong SQL-plus: thay thế và liên kết.

Đây là thay thế (các biến thay thế có thể thay thế các tùy chọn lệnh SQL * Plus hoặc văn bản được mã hóa cứng khác):

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

Đây là ràng buộc (các biến liên kết lưu trữ các giá trị dữ liệu cho các câu lệnh SQL và PL / SQL được thực thi trong RDBMS; chúng có thể chứa các giá trị đơn lẻ hoặc tập hợp kết quả hoàn chỉnh):

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

SQL Developer hỗ trợ các biến thay thế, nhưng khi bạn thực hiện một truy vấn với :varcú pháp liên kết, bạn sẽ được nhắc về liên kết (trong hộp thoại).

Tài liệu tham khảo:

UPDATE biến thay thế hơi khó sử dụng, hãy xem:

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
Tôi đã thử liên kết trong SQL Developer (4.1.1.19) và nó cũng đang hoạt động. Ý tôi là trường hợp có var xexec :x, không có dấu nhắc.
Betlista

50

Trong SQL * Plus, bạn có thể làm điều gì đó tương tự

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

Trong SQL Developer, nếu bạn chạy một câu lệnh có bất kỳ số lượng biến ràng buộc nào (bắt đầu bằng dấu hai chấm), bạn sẽ được nhắc nhập giá trị. Như Alex đã chỉ ra, bạn cũng có thể làm điều gì đó tương tự bằng cách sử dụng chức năng "Run Script" (F5) với cú pháp EXEC thay thế mà Alex gợi ý.

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
nếu bạn 'chạy tập lệnh' (F5) thay vì 'câu lệnh chạy' thì nó sẽ không nhắc các biến liên kết. Nhưng có vẻ như nó không thích select...into(ORA-01006), vì vậy bạn cần phải làm exec :v_emp_id := 1234;thay thế.
Alex Poole,

@Alex - Đẹp! Tôi vừa từ bỏ và cho rằng SQL Developer luôn nhắc các giá trị biến ràng buộc. Tôi đã kết hợp các đề xuất của bạn vào câu trả lời của tôi.
Justin Cave

1
@Nathan nếu bạn đang muốn thực thi một gói với: v_emp_id, bạn cũng có thể sử dụng các biến ràng buộc cho các con trỏ chuột. Xem dưới cùng của Alex câu trả lời cho một câu hỏi tương tự như tôi đã
Conrad Frix

2
@AlexPoole có cách nào để gửi kết quả đến cửa sổ Kết quả truy vấn không? Trong công việc của mình, tôi chạy các truy vấn để xuất sang tệp Excel.
tp9

13

Được rồi, tôi biết điều này hơi khó nhưng đây là một cách để sử dụng một biến trong một truy vấn đơn giản, không phải là một tập lệnh:

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

Bạn có thể chạy nó ở khắp mọi nơi.


Có cách nào để sử dụng điều này với UPDATE thay vì chọn không?
Ron Jensen - Chúng ta đều Monica

12

Câu trả lời đơn giản KHÔNG.

Tuy nhiên, bạn có thể đạt được điều gì đó tương tự bằng cách chạy phiên bản sau sử dụng các biến liên kết:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Khi bạn chạy truy vấn ở trên trong SQL Developer, bạn sẽ được nhắc nhập giá trị cho biến liên kết EmployeeID.


8

Bạn có thể đọc ở những nơi khác về các biến thay thế; chúng khá tiện dụng trong SQL Developer. Nhưng tôi đã cố gắng sử dụng các biến ràng buộc trong SQL Developer. Đây là những gì tôi làm:

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 làm cho nó để văn bản có thể được in ra bảng điều khiển đầu ra tập lệnh.

Tôi tin rằng những gì chúng tôi đang làm ở đây chính thức được gọi là PL / SQL. Chúng tôi đã rời khỏi vùng đất thuần SQL và đang sử dụng một công cụ khác trong Oracle. Bạn thấy SELECTở trên? Trong PL / SQL, bạn luôn phải SELECT ... INTObiến hoặc một con trỏ chuột. Bạn không thể chỉ SELECTvà trả về một tập hợp kết quả trong PL / SQL.


2

Tôi nghĩ rằng cách dễ nhất trong trường hợp của bạn là:

DEFINE EmpIDVar = 1234;

SELECT *
FROM Employees
WHERE EmployeeID = &EmpIDVar

Đối với các giá trị chuỗi sẽ giống như sau:

DEFINE EmpIDVar = '1234';

SELECT *
FROM Employees
WHERE EmployeeID = '&EmpIDVar'

1

Sử dụng truy vấn tiếp theo:

DECLARE 
  EmpIDVar INT;

BEGIN
  EmpIDVar := 1234;

  SELECT *
  FROM Employees
  WHERE EmployeeID = EmpIDVar;
END;

trả về lỗi "PLS-00428 một mệnh đề INTO được mong đợi trong câu lệnh SELECT này"
Thundter

0

Hãy thử cách này, nó sẽ hoạt động, tốt hơn là tạo một thủ tục, nếu thủ tục không thể thực hiện được, bạn có thể sử dụng tập lệnh này.

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

0

Trong sql nhà phát triển xác định thuộc tính theo mặc định "BẬT". Nếu nó là "TẮT" trong bất kỳ trường hợp nào, hãy sử dụng các bước dưới đây.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.