在Select语句中设置变量

在Select语句中设置变量

本文介绍了宣告&在Select语句中设置变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图编写一个简单的查询,在其中声明一些变量,然后在Oracle的select语句中使用它们.我以前可以在SQL Server中执行以下操作:

I'm attempting to write a simple query where I declare some variables and then use them in a select statement in Oracle. I've been able to do this before in SQL Server with the following:

DECLARE @date1   DATETIME
SET @date1 = '03-AUG-2010'

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

从我完成的搜索看来,您无法在Select语句中声明和设置像这样的变量.这是对的还是我发短信了?

From the searching I've done it appears you can not declare and set variables like this in Select statements. Is this right or am I mssing something?

推荐答案

从搜索完成后,您似乎无法在Select语句中声明和设置像这样的变量.这是对的还是我错过了什么?

在Oracle PL/SQL和SQL中,是两种具有两种单独引擎的独立语言.您可以将SQL DML嵌入PL/SQL中,这将为您提供变量.如下面的匿名PL/SQL块.请注意,最后的/不是PL/SQL的一部分,而是告诉SQL * Plus发送前面的块.

Within Oracle PL/SQL and SQL are two separate languages with two separate engines. You can embed SQL DML within PL/SQL, and that will get you variables. Such as the following anonymous PL/SQL block. Note the / at the end is not part of PL/SQL, but tells SQL*Plus to send the preceding block.

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代码等效的块将不起作用:

The problem is that a block that is equivalent to your T-SQL code will not work:

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(匿名块,存储过程或存储函数)中传递查询结果,必须声明,打开游标,然后将其返回给调用程序. (超出了回答此问题的范围.参见获取oracle存储过程的结果集)

To pass the results of a query out of an PL/SQL, either an anonymous block, stored procedure or stored function, a cursor must be declared, opened and then returned to the calling program. (Beyond the scope of answering this question. see Get resultset from oracle stored procedure)

连接到数据库的客户端工具可能具有其自己的绑定变量.在SQL * Plus中:

The client tool that connects to the database may have it's own bind variables. In 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开发人员中运行,等等.以variable和exec开头的行是SQL Plus命令.它们不是SQL或PL/SQL命令.由于表为空,因此未选择任何行.

Note the above is in SQLPlus, may not (probably won't) work in Toad PL/SQL developer, etc. The lines starting with variable and exec are SQLPlus commands. They are not SQL or PL/SQL commands. No rows selected because the table is empty.

这篇关于宣告&在Select语句中设置变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 18:41