下面是在SQL Server 2000中如何在Oracle SQL Developer中使用變量?
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
我想用SQL開發人員無需額外的複雜性做同樣的事情在Oracle中使用變量的一個例子。這似乎是一件非常簡單的事情,但我找不到一個簡單的解決方案。我該怎麼做?
下面是在SQL Server 2000中如何在Oracle SQL Developer中使用變量?
DECLARE @EmpIDVar INT
SET @EmpIDVar = 1234
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDVar
我想用SQL開發人員無需額外的複雜性做同樣的事情在Oracle中使用變量的一個例子。這似乎是一件非常簡單的事情,但我找不到一個簡單的解決方案。我該怎麼做?
簡單的回答沒有。
但是可以實現通過使用綁定變量運行以下版本類似的東西:一旦你上面運行在SQL Developer中,你會被提示綁定變量僱員輸入值查詢
SELECT * FROM Employees WHERE EmployeeID = :EmpIDVar
。
在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;
如果您'運行腳本'(F5)而不是'運行語句',那麼它不會提示輸入綁定變量。但它似乎不喜歡'select ... into'(ORA-01006),因此您需要執行'exec:v_emp_id:= 1234;'而不是。 – 2011-04-13 18:37:20
@亞歷克斯 - 尼斯!我只是放棄了,並假定SQL Developer總是提示綁定變量值。我將你的建議納入我的答案。 – 2011-04-13 19:00:30
@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
我正在使用版本3.2中的SQL Developer。其他的東西不爲我工作,但這並:
define value1 = 'sysdate'
SELECT &&value1 from dual;
而且它在這裏提出的靈巧方式,但。
(如果省略了「定義」 -part會提示你該值)
也適用於只有一個& – 2013-04-09 15:01:00
如果將&& value1與字符串值進行比較,如:&& value1 ='某個字符串',則&& value1需要用單引號括起來,如'&& value1'='某個字符串' – 2014-03-05 21:29:32
在SQL Developer中,替代變量定義通過DEFINE似乎在查詢執行之間持續存在。如果我更改變量值,但在執行時沒有明確突出顯示DEFINE行,則前一個值將保留。 (這是因爲double &&?) – Baodad 2014-05-13 23:00:04
有在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
我嘗試過SQL Developer中的綁定(4.1.1.19),它也在工作。我的意思是'var x'和'exec:x'的情況,沒有提示。 – Betlista 2016-05-12 06:59:08
你可以在其他地方閱讀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中的結果集。
好吧我該知道一個黑客位,但是這在一個簡單的查詢不腳本中使用變量的方式:
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
你到任何地方運行它。
有沒有辦法使用UPDATE而不是select? – 2016-08-26 22:16:40
使用一個查詢:
DECLARE
EmpIDVar INT;
BEGIN
EmpIDVar := 1234;
SELECT *
FROM Employees
WHERE EmployeeID = EmpIDVar;
END;
試試這個它會工作,最好創建一個程序,如果程序是不可能的,你可以使用這個腳本。
with param AS(
SELECT 1234 empid
FROM dual)
SELECT *
FROM Employees, param
WHERE EmployeeID = param.empid;
END;
作爲存儲過程還是作爲腳本?如果您對EmpIDVar的值進行硬編碼,爲什麼要使用變量? – kurosch 2011-04-13 18:03:14