尽管花了一个小时进行研究,我似乎无法弄清楚如何正确定义变量然后在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:当期待其中一个时遇到符号“文件结束” 以下内容:
开始功能包编译指示程序子类型使用表格当前 光标
我很想知道如何做这么简单的任务!
答案 0 :(得分:13)
您的变量声明是正确的。
DECLARE
关键字用于定义PL / SQL块中的变量(其主体由BEGIN
和END;
分隔)。你想如何使用这个变量?
以下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;