简单的Oracle变量SQL赋值

时间:2011-11-07 17:06:43

标签: oracle variables plsql toad

尽管花了一个小时进行研究,我似乎无法弄清楚如何正确定义变量然后在SQL中使用它。

这是我迄今为止所做的:

DECLARE startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');

我收到了回复:

  

ORA-06550:第1行,第63栏:PLS-00103:遇到符号   期待下列之一的“文件结束”:

     

开始功能包编译指示程序子类型使用表格当前   光标

     

详细信息:DECLARE startDate DATE:= to_date('03 / 11/2011',   '日/月/年');第1行ORA-06550错误:第1行第63列:   PLS-00103:当期待其中一个时遇到符号“文件结束”   以下内容:

     

开始功能包编译指示程序子类型使用表格当前   光标

我很想知道如何做这么简单的任务!

5 个答案:

答案 0 :(得分:13)

您的变量声明是正确的。

DECLARE关键字用于定义PL / SQL块中的变量(其主体由BEGINEND;分隔)。你想如何使用这个变量?

以下PL / SQL对我来说很好用:

DECLARE 
    startDate DATE := to_date('03/11/2011', 'dd/mm/yyyy');
    reccount INTEGER;
BEGIN
    SELECT count(*) INTO reccount 
        FROM my_table tab 
        WHERE tab.somedate < startDate;
    dbms_output.put_line(reccount);
END;

您还可以使用DEFINE语句来使用简单的字符串替换变量。它们适用于SQL / PLUS或TOAD等客户端。

DEFINE start_date = "to_date('03/11/2011', 'dd/mm/yyyy')"
SELECT COUNT(*) from my_table tab where tab.some_date < &start_date;

答案 1 :(得分:5)

要完成您在Toad中尝试的操作,您根本不需要声明变量。只需在变量前面加上冒号,Toad会在执行查询时提示您输入变量的值。例如:

select * from all_tables where owner = :this_is_a_variable;

如果最初不起作用,请右键单击编辑器中的任意位置,并确保选中“提示替换变量”。

如果你真的希望这样做与SQL Server处理变量的方式类似(或者你希望能够在SQL * Plus中做同样的事情),你可以按如下方式编写它:

var this_is_a_variable varchar2(30); 

exec :this_is_a_variable := 'YOUR_SCHEMA_NAME';

print this_is_a_variable;

select * from all_tables where owner = :this_is_a_variable;

但是,要在Toad中使用它,您需要通过“Execute as script”而不是典型的“Execute语句”命令来运行它。

答案 2 :(得分:3)

请记住,Oracle的PL / SQL 不是 SQL。

PL / SQL是一种过程语言。 SQL不是程序性的,但您可以定义用户可以通过“&amp; var”语法输入的“变量”(参见http://www.orafaq.com/node/515)。

答案 3 :(得分:3)

这是一篇很老的帖子,但万一有人偶然发现(就像我刚才那样),你可以用CTE处理这个问题:

with params as (
      select date '2011-11-03' as startdate
      from dual
     )
select . . .
from params cross join
     . . .

几乎相同的语法在SQL Server中工作(减去date特定的东西和from dual)。

答案 4 :(得分:0)

请你试试这个:

DEF  startDate = to_date('03/11/2011', 'dd/mm/yyyy');
Select &startDate from dual;