sql – 在Select语句中声明和设置变量

我正在尝试写一个简单的查询,其中我声明一些变量,然后在Oracle中的select语句中使用它们.我以前在sql Server中可以执行以下操作:
DECLARE @date1   DATETIME
SET @date1 = '03-AUG-2010'

SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1

搜索完成后,您将无法在Select语句中声明和设置变量.这是正确的还是我妈的东西?

解决方法

搜索完成后,您将无法在Select语句中声明和设置变量.这是正确的还是我错过的东西?

在Oracle PL / sqlsql中有两种单独的语言,分别有两个引擎.您可以在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;
/

问题是,相当于您的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

要将PL / sql中的查询结果传递给匿名块,存储过程或存储函数,必须声明,打开并返回到调用程序. (超越这个问题的范围编辑:见Get resultset from oracle stored procedure)

连接到数据库的客户端工具可能拥有自己的绑定变量.在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

注意上面是sqlPlus,可能不会(可能不会)在Toad PL / sql开发人员等工作.从变量和exec开始的行是sqlPlus命令.它们不是sql或PL / sql命令.由于表为空,因此未选择行.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...