声明&在Select语句中设置变量

时间:2010-08-03 19:26:21

标签: 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

从我已经完成的搜索中看来,你无法在Select语句中声明和设置这样的变量。这是正确的还是我在讨论什么?

5 个答案:

答案 0 :(得分:15)

从我已经完成的搜索中看来,你无法在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;
/

问题是与您的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

注意上面是在SQL Plus中,可能不会(可能不会)在Toad PL / SQL开发人员等中工作。以变量和exec开头的行是SQL Plus命令。它们不是SQL或PL / SQL命令。没有选择行,因为表是空的。

答案 1 :(得分:3)

我试过这个并且有效:

define PROPp_START_DT = TO_DATE('01-SEP-1999')

select * from proposal where prop_start_dt = &PROPp_START_DT

答案 2 :(得分:1)

SET命令是特定于TSQL的 - 这是与您发布的内容相当的PLSQL:

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY');

SELECT u.visualid
  FROM USAGE u 
 WHERE u.usetime > v_date1;

也不需要在变量前加上“@”;我倾向于用变量“v_”作为前缀来区分变量&列/等

this thread about the Oracle equivalent of NOLOCK ...

答案 3 :(得分:0)

尝试to_date功能。

答案 4 :(得分:0)

同样来自 SQL Server,这让我很烦恼。对于那些使用Toad Data PointToad for Oracle 的人来说,这非常简单。只需在您的变量名称前放置一个冒号,就会提示 Toad 打开一个对话框,您可以在其中输入执行时的值。

SELECT * FROM some_table WHERE some_column = :var_name;