Answers:
我正在使用3.2版中的SQL-Developer。其他东西对我不起作用,但是这样做:
define value1 = 'sysdate'
SELECT &&value1 from dual;
这也是这里介绍的最巧妙的方法。
(如果省略“定义”部分,则将提示您输入该值)
SQL-plus中有两种类型的变量:替换和绑定。
这是替换(替换变量可以替换SQL * Plus命令选项或其他硬编码文本):
define a = 1;
select &a from dual;
undefine a;
这是绑定(绑定变量存储在RDBMS中执行的SQL和PL / SQL语句的数据值;它们可以保存单个值或完整的结果集):
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 stripped as it is a number
select '&phone' from dual; -- plus is preserved as it is a string
var x
和exec :x
,没有提示。
在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;
select...into
(ORA-01006),因此您需要这样做exec :v_emp_id := 1234;
。
好的,我知道这有点hack,但这是在简单查询中而不是脚本中使用变量的一种方式:
WITH
emplVar AS
(SELECT 1234 AS id FROM dual)
SELECT
*
FROM
employees,
emplVar
WHERE
EmployId=emplVar.id;
您可以在任何地方运行它。
您可以在其他地方阅读有关替代变量的内容。它们在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
使用变量或反射器。您不能只是SELECT
在PL / SQL中返回结果集。
使用下一个查询:
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;