我试图编写一个简单的查询,在其中声明一些变量,然后在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 / SQL和SQL中,是两种具有两种单独引擎的独立语言。您可以将SQL DML嵌入PL / SQL中,这将为您提供变量。如下面的匿名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
请注意,以上内容是在SQL Plus中使用的,在Toad PL / SQL开发人员中可能(可能不会)运行,等等。以variable和exec开头的行是SQL Plus命令。它们不是SQL或PL / SQL命令。由于表为空,因此未选择任何行。