Sql 申报及;在Select语句中设置变量
我试图编写一个简单的查询,在其中声明一些变量,然后在Oracle的select语句中使用它们。我以前在SQL Server中通过以下方式实现了这一点: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语句中声明和设置这样的变量。这是对的还是我在发消息?
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日期的函数。