2011-04-13 94 views
80

Dưới đây là một ví dụ của việc sử dụng các biến trong SQL Server 2000.Làm cách nào để sử dụng các biến trong Oracle SQL Developer?

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 sử dụng SQL Developer mà không phức tạp thêm. Nó có vẻ như là một điều 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?

+0

Làm thủ tục được lưu trữ hoặc làm tập lệnh? Nếu bạn đang hardcoding giá trị cho EmpIDVar, tại sao sử dụng một biến ở tất cả? – kurosch

Trả lời

11

Câu trả lời đơn giản NO.

Tuy nhiên bạn có thể đạt được một cái gì đó tương tự bằng cách chạy các phiên bản sau đây sử dụng các biến ràng buộc:

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

Khi bạn chạy các truy vấn trên trong SQL Developer, bạn sẽ được nhắc nhở để nhập giá trị cho các EmployeeID biến ràng buộc.

45

Trong SQL * Plus, bạn có thể làm một cái gì đó rất giống

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 tuyên bố rằng có bất kỳ số lượng các biến ràng buộc (bắt đầu bằng dấu hai chấm), bạn sẽ được nhắc nhở để nhập các giá trị. Như Alex chỉ ra, bạn cũng có thể làm một cái gì đó tương tự bằng cách sử dụng chức năng "Run Script" (F5) với cú pháp thay thế EXEC 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; 
+13

nếu bạn 'chạy tập lệnh' (F5) thay vì 'chạy câu lệnh' thì nó sẽ không nhắc cho các biến liên kết. Nhưng nó dường như không thích 'select ... into' (ORA-01006), vì vậy bạn cần phải thực hiện' exec: v_emp_id: = 1234; 'thay vào đó. –

+0

@ Alex - Tuyệt vời! Tôi đã từ bỏ và giả định rằng Nhà phát triển SQL luôn nhắc nhở các giá trị biến liên kết. 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. –

+1

@Nathan nếu bạn đang tìm cách thực hiện một gói với: v_emp_id, bạn có thể sử dụng các biến liên kết cho các refcursors là tốt. Xem phần dưới cùng của [answer] của Alex (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from-an-oracle-package-procedure/3527037#3527037) để một câu hỏi tương tự tôi đã có –

60

Tôi đang sử dụng SQL-Developer trong phiên bản 3.2. Các nội dung khác không hiệu quả đối với tôi, nhưng điều này đã làm cho tôi:

define value1 = 'sysdate' 

SELECT &&value1 from dual; 

Ngoài ra, đó là cách mượt mà nhất được trình bày tại đây.

(Nếu bạn bỏ qua "định nghĩa" -part bạn sẽ được nhắc nhở cho giá trị đó)

+12

cũng chỉ hoạt động với một & –

+8

Nếu so sánh && value1 với giá trị chuỗi như: && value1 = 'Một số chuỗi' thì && value1 cần được bao bọc trong các dấu ngoặc đơn như: '&& value1' = 'Một số chuỗi' –

+1

Trong SQL Developer, các biến thay thế được xác định bởi DEFINE dường như tồn tại dai dẳng giữa các lần thực hiện truy vấn. Nếu tôi thay đổi giá trị biến, nhưng không rõ ràng làm nổi bật dòng DEFINE khi thực hiện, giá trị trước đó vẫn còn. (Đây có phải là do số double &&?) – Baodad

49

Có hai loại biến trong SQL-cộng: thay thế và ràng buộc.

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

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

Đây là bind (biến ràng buộc cửa hàng giá trị dữ liệu cho SQL và PL/Các câu lệnh SQL được thực hiện trong RDBMS; chúng có thể chứa các giá trị đơn hoặc các tậ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 cú pháp ràng buộc :var mà bạn được nhắc cho ràng buộc (trong hộp thoại).

tham khảo:

CẬP NHẬTthay biến là một chút khó khăn để sử dụng, xem xét:

define phone = '+38097666666'; 
select &phone from dual; -- plus is striped as it is number)) 
select '&phone' from dual; -- plus is preserved as it is string 
+2

Tôi đã thử ràng buộc trong SQL Developer (4.1.1.19) và nó cũng đang hoạt động. Tôi có nghĩa là trường hợp với 'var x' và' exec: x', không có dấu nhắc. – Betlista

4

Bạn có thể đọc ở nơi khác trên substi biến tution; chúng khá tiện dụng trong SQL Developer. Nhưng tôi có phù hợp vớ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 văn bản có thể in ra bàn đ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 SQL thuần túy và đang sử dụng một công cụ khác trong Oracle. Bạn thấy số SELECT ở trên? Trong PL/SQL, bạn luôn phải SELECT ... INTO hoặc biến hoặc một refcursor. Bạn không thể chỉ SELECT và trả về một tập kết quả trong PL/SQL.

5

Ok Tôi biết điều này một chút của một hack nhưng điều này 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 kịch bản:

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.

+0

Có cách nào để sử dụng tính năng này với UPDATE thay vì chọn không? –

0

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

DECLARE 
    EmpIDVar INT; 

BEGIN 
    EmpIDVar := 1234; 

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

Hãy thử điều này nó sẽ làm việc, nó tốt hơn tạo ra một thủ tục, nếu thủ tục là không thể, bạn có thể sử dụng kịch bản này.

with param AS(
SELECT 1234 empid 
FROM dual) 
SELECT * 
    FROM Employees, param 
    WHERE EmployeeID = param.empid; 
END; 
Các vấn đề liên quan