Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 申报及;在Select语句中设置变量_Sql_Oracle_Variables_Plsql - Fatal编程技术网

Sql 申报及;在Select语句中设置变量

Sql 申报及;在Select语句中设置变量,sql,oracle,variables,plsql,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语句中声明和设置这样的变量。这是对的还是我在发消息?

我试图编写一个简单的查询,在其中声明一些变量,然后在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语句中声明和设置这样的变量。这是对的还是我在发消息?

试试这个函数。

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_”,以区分变量和列等

请参见…

在我所做的搜索中,您似乎无法在Select语句中声明和设置这样的变量。这是对的还是我遗漏了什么

在Oracle中,PL/SQL和SQL是两种独立的语言,具有两个独立的引擎。您可以在PL/SQL中嵌入SQLDML,这将获得变量。例如下面的匿名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(匿名块、存储过程或存储函数)中传递出去,必须声明、打开游标,然后将其返回给调用程序。(超出回答此问题的范围。编辑:请参阅)

连接到数据库的客户端工具可能有自己的绑定变量。在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 developer中工作,等等。以variable和exec开头的行是SQLPlus命令。它们不是SQL或PL/SQL命令。没有选择行,因为表是空的。

我尝试过这个方法,但效果很好:

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

select * from proposal where prop_start_dt = &PROPp_START_DT

同样来自SQL Server,这让我很头疼。对于那些使用Toad Data Point或Toad For Oracle的用户来说,这非常简单。只要在变量名前面加一个冒号,就会提示Toad打开一个对话框,在其中输入execute时的值

SELECT * FROM some_table WHERE some_column = :var_name;

我实际上是在尝试设置一个日期值(或VARCHAR2值),然后在select语句中引用它。我认为TO_日期更像是一个将字符串转换为Oracle日期的函数。