Mat*_*ine 20 sql oracle variables plsql
我正在尝试编写一个简单的查询,我在其中声明一些变量,然后在Oracle的select语句中使用它们.之前我已经能够在SQL Server中执行以下操作:
DECLARE @date1 DATETIME
SET @date1 = '03-AUG-2010'
SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1
Run Code Online (Sandbox Code Playgroud)
从我已经完成的搜索看来,你无法在Select语句中声明和设置这样的变量.这是正确的还是我在忙什么?
Sha*_*nce 16
从我已经完成的搜索看来,你无法在Select语句中声明和设置这样的变量.这是对的还是我错过了什么?
在Oracle PL/SQL和SQL中有两种不同的语言,带有两个独立的引擎.您可以在PL/SQL中嵌入SQL DML,这将为您提供变量.如下面的匿名PL/SQL块.注意/最后不是PL/SQL的一部分,但告诉SQL*Plus发送前面的块.
declare
v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
v_Count number;
begin
select count(*) into v_Count
from Usage
where UseTime > v_Date1;
dbms_output.put_line(v_Count);
end;
/
Run Code Online (Sandbox Code Playgroud)
问题是,与您的T-SQL代码等效的块将不起作用:
SQL> declare
2 v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
3 begin
4 select VisualId
5 from Usage
6 where UseTime > v_Date1;
7 end;
8 /
select VisualId
*
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement
Run Code Online (Sandbox Code Playgroud)
要从PL/SQL(匿名块,存储过程或存储函数)传递查询结果,必须声明,打开游标然后返回到调用程序.(超出了回答这个问题的范围.编辑:请参阅从oracle存储过程获取结果集)
连接到数据库的客户端工具可能拥有自己的绑定变量.在SQL*Plus中:
SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';
PL/SQL procedure successfully completed.
SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
2 from Usage
3 where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');
no rows selected
Run Code Online (Sandbox Code Playgroud)
注意上面是在SQL Plus中,可能不会(可能不会)在Toad PL/SQL开发人员等中工作.以variable和exec开头的行是SQL Plus命令.它们不是SQL或PL/SQL命令.没有选择行,因为表是空的.