2011-04-13 161 views
80

下面是在SQL Server 2000中如何在Oracle SQL Developer中使用變量?

DECLARE @EmpIDVar INT 

SET @EmpIDVar = 1234 

SELECT * 
FROM Employees 
WHERE EmployeeID = @EmpIDVar 

我想用SQL開發人員無需額外的複雜性做同樣的事情在Oracle中使用變量的一個例子。這似乎是一件非常簡單的事情,但我找不到一個簡單的解決方案。我該怎麼做?

+0

作爲存儲過程還是作爲腳本?如果您對EmpIDVar的值進行硬編碼,爲什麼要使用變量? – kurosch 2011-04-13 18:03:14

回答

11

簡單的回答沒有。

但是可以實現通過使用綁定變量運行以下版本類似的東西:一旦你上面運行在SQL Developer中,你會被提示綁定變量僱員輸入值查詢

SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar 

45

在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指出的那樣,你也可以使用「運行腳本」功能(F5)和Alex建議的替代EXEC語法來做類似的事情。

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

如果您'運行腳本'(F5)而不是'運行語句',那麼它不會提示輸入綁定變量。但它似乎不喜歡'select ... into'(ORA-01006),因此您需要執行'exec:v_emp_id:= 1234;'而不是。 – 2011-04-13 18:37:20

+0

@亞歷克斯 - 尼斯!我只是放棄了,並假定SQL Developer總是提示綁定變量值。我將你的建議納入我的答案。 – 2011-04-13 19:00:30

+1

@Nathan如果你想用v_emp_id執行一個包,你也可以使用綁定變量作爲refcursors。見亞歷克斯的底部[答案](http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from-an-oracle-package-procedure/3527037#3527037)至我有一個類似的問題 – 2011-04-13 19:11:43

60

我正在使用版本3.2中的SQL Developer。其他的東西不爲我工作,但這並:

define value1 = 'sysdate' 

SELECT &&value1 from dual; 

而且它在這裏提出的靈巧方式,但。

(如果省略了「定義」 -part會提示你該值)

+12

也適用於只有一個& – 2013-04-09 15:01:00

+8

如果將&& value1與字符串值進行比較,如:&& value1 ='某個字符串',則&& value1需要用單引號括起來,如'&& value1'='某個字符串' – 2014-03-05 21:29:32

+1

在SQL Developer中,替代變量定義通過DEFINE似乎在查詢執行之間持續存在。如果我更改變量值,但在執行時沒有明確突出顯示DEFINE行,則前一個值將保留。 (這是因爲double &&?) – Baodad 2014-05-13 23:00:04

49

有在SQL加兩種類型的變量:替代和綁定。

這是取代(替換變量可代替SQL * Plus命令選項或其它硬編碼文本):

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

這是SQL和PL 綁定(綁定變量存儲數據值/ SQL語句的執行RDBMS,它們可以容納單值或完整的結果集):

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 striped as it is number)) 
select '&phone' from dual; -- plus is preserved as it is string 
+2

我嘗試過SQL Developer中的綁定(4.1.1.19),它也在工作。我的意思是'var x'和'exec:x'的情況,沒有提示。 – Betlista 2016-05-12 06:59:08

4

你可以在其他地方閱讀substi變量;他們在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。您不能僅僅使用SELECT並返回PL/SQL中的結果集。

5

好吧我該知道一個黑客位,但是這在一個簡單的查詢不腳本中使用變量的方式:

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

你到任何地方運行它。

+0

有沒有辦法使用UPDATE而不是select? – 2016-08-26 22:16:40

0

使用一個查詢:

DECLARE 
    EmpIDVar INT; 

BEGIN 
    EmpIDVar := 1234; 

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

試試這個它會工作,最好創建一個程序,如果程序是不可能的,你可以使用這個腳本。

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