Sql 甲骨文:收到ORA-06550和PLS-00905
我有一个假日表,其中包含以下数据:Sql 甲骨文:收到ORA-06550和PLS-00905,sql,oracle,plsql,ora-00933,ora-06550,Sql,Oracle,Plsql,Ora 00933,Ora 06550,我有一个假日表,其中包含以下数据: HOLIDAYDA DESCRIPTION --------- -------------------- 19-JAN-11 to 17-JAN-11 to 10-JAN-11 new day 现在我要一周的第一个工作日。IE:如果我通过“2011年1月12日”作为输入,我希望o/p作为2011年1月11日作为第一个工作日,因为2011年1月10日是假日 这是我的密码: create or replace procedure
HOLIDAYDA DESCRIPTION
--------- --------------------
19-JAN-11 to
17-JAN-11 to
10-JAN-11 new day
现在我要一周的第一个工作日。IE:如果我通过“2011年1月12日”作为输入,我希望o/p作为2011年1月11日作为第一个工作日,因为2011年1月10日是假日
这是我的密码:
create or replace procedure sample as
l_dStartDay date;
l_dHolidayDate date;
begin
select trunc(to_date(sysdate),'Day')
into l_dStartday
from dual;
dbms_output.put_line('first day of the week ');
dbms_output.put_line(l_dStartDay);
for i in 2..5 Loop
select holidaydate
from holiday
into l_dHolidayDate
where holidaydate = (l_dStartDay + i);
if(l_dHolidaydate is null) then
dbms_output.put_line(l_dStartDay+i);
end if;
exit;
end loop;
end;
我编译了上面的程序,但是使用了“编译错误创建的过程”
新增:
遵从错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
9/1 PL/SQL: SQL Statement ignored
9/33 PL/SQL: ORA-00933: SQL command not properly ended
错误:
BEGIN sample; END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SYSTEM.SAMPLE is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
谁能告诉我错误的原因吗?如果可能的话,告诉我解决方法?我猜这条线
where holidaydate = l_dStartDay + i);
是错误的,因为它有一个)
不应该在的位置
“我编译了上述程序,但使用了
用编译创建的过程
错误“
如果您使用的是像TOAD或sqldeveloper这样的IDE,它会自动显示编译错误。否则,可以使用以下命令在SQL*Plus中访问它们:
SQL> show errors
我们还可以查询用户错误等视图
问题很可能是SELECT语句,因为INTO子句应该紧跟在投影之后:
select holidaydate
into l_dHolidayDate
from holiday
where holidaydate = l_dStartDay + i);
请注意,这看起来也是错误的:
select trunc(to_date(sysdate),'Day')
SYSDATE已经是一个日期了,尽管较新版本的Oracle倾向于更宽容地在日期列上使用to_DATE。从日期截断时间元素时,无需包含格式掩码,因为这是默认行为:
trunc(some_date_variable)
如果(比如)我们想要月的第一天,我们只需要包括一个面具:
trunc(some_date_variable, 'MON')
如果要查找一周中的第一天,可以执行以下操作:
SQL> select
2 trunc(to_date('01-DEC-2010', 'DD-MON-YYYY'), 'D') start_of_wk
3 from dual
4 /
START_OF_
---------
29-NOV-10
SQL>
请注意,一周的第一天取决于区域设置。在一些地区,一周的第一天是工作日(例如英国的星期一),而在其他地区则不是(美国的星期日是第一天)。因此,可能需要添加偏移量
解决编译错误后,您将发现soem运行时错误,可能与未处理的“未找到数据”异常有关。这是因为当查找查询没有找到匹配的记录时,它不会返回NULL,它将失败 这是一个简单的过程。它使用SQL解决方案,因为SQL是最有效的做事方式。内部查询使用CONNECT BY技巧生成日期的结果集。然后使用减号集操作符减少该值,该操作符将过滤掉该周范围内的所有假日。最后,外部查询返回查询中最早的日期
create or replace procedure get_first_working_day
( p_tgt_date in date )
is
l_st_day date := trunc(p_tgt_date, 'D');
l_working_day date := trunc(p_tgt_date, 'D');
begin
dbms_output.put_line('first day of week = '||l_st_day);
select min(day_of_wk)
into l_working_day
from ( select l_st_day + (level-1) as day_of_wk
from dual
connect by level <= 5
minus
select holidaydate
from hols
where holidaydate between l_st_day and l_st_day + 4 );
dbms_output.put_line('first working day of week = '||l_working_day
||'::'|| to_char(l_working_day, 'DAY'));
end get_first_working_day;
/
。。。以下是实际操作过程:
SQL> set serveroutput on size unlimited
SQL>
SQL> exec get_first_working_day (sysdate)
first day of week = 10-JAN-11
first working day of week = 10-JAN-11::MONDAY
PL/SQL procedure successfully completed.
SQL>
SQL> exec get_first_working_day (to_date( '04-JAN-2011', 'DD-MON-YYYY'))
first day of week = 03-JAN-11
first working day of week = 04-JAN-11::TUESDAY
PL/SQL procedure successfully completed.
SQL>
SQL> exec get_first_working_day (to_date( '01-JAN-2011', 'DD-MON-YYYY'))
first day of week = 27-DEC-10
first working day of week = 29-DEC-10::WEDNESDAY
PL/SQL procedure successfully completed.
SQL>
顺便说一句,这是非常糟糕的做法:
PLS-00905: object SYSTEM.SAMPLE is invalid
不要将内置的系统或系统帐户用于您自己的工作。打碎东西的机会太大了。改为创建一个新的用户帐户。除了前面提到的错误之外,请尝试删除“EXIT”子句,因为此循环将迭代固定次数。此外,请尝试在结束块时指定块名称,如下所示:
LOOP
...
END LOOP;
END ObjectName;
其中ObjectName是顶级程序。这里是“样本”,因此:
LOOP
...
END LOOP;
END sample;
那么,编译错误是什么呢?显然,您不能调用未编译的过程。@sjngm:我收到的消息是“警告:使用编译错误创建的过程”。@Rajesh Kumar G:这对任何人都没有帮助。编译错误是什么?如果使用SQL*Plus,则可以使用
显示错误
(或shortSHO ERR
)查看这些错误。@sjngm:我在代码中添加了编译错误。请选中它“new added:Compliation ERRORS”第9行指向SELECT语句。因此,这将是我在回复中提到的错误放置到子句中。有输入错误。现在我更改了代码。检查一下,我还是收到了同样的错误。
LOOP
...
END LOOP;
END sample;