Pl / SQL代码更正

时间:2013-11-25 19:58:16

标签: sql oracle

我创建了一个代码,用于计算每个月2020年的天数。我的原始代码有三列,但我的任务只需要创建两列。我无法计算我的代码只能使用两列。我想知道是否有人可以通过删除计数列并确保我的代码仍能产生正确的输出来帮助我解决这个问题。

set serveroutput on

--- Drop Table
DROP TABLE MONTH_DAYS;
--- Create Table 
CREATE TABLE MONTH_DAYS(cnt number(2), Month_ Varchar(9),Days_ Number(2));

Declare
months varchar2(10);
days varchar2(10);
i Binary_integer := 0;

Begin
loop
i:= i+1;
if i = 13 then
exit;
end if;
insert into month_days(cnt, month_, days_)
values
(i, to_char(add_months(to_date('20200112', 'YYYYDDMM'), i), 'Month'),
to_char(last_day(add_months(to_date('20200112', 'YYYYDDMM'), i)), 'DD'));

select month_ , days_ 
into months, days 
from month_days 
where cnt = i;
DBMS_OUTPUT.PUT_LINE('Month: '||Months||'Days: '|| Days);
end loop;
end; 
/

2 个答案:

答案 0 :(得分:0)

看起来很多代码,可以在一行中完成:

create table month_days as
select to_char(to_date('01-'||rownum||'-2020','dd-mm-yyyy'),'MON') month,
       to_char(last_Day(to_date('01-'||rownum||'-2020','dd-mm-yyyy')),'dd') days
  from dual connect by level <=12
/

希望有帮助...

答案 1 :(得分:0)

有几种方法可以实现您的要求。 第一个似乎是使用insert语句的return into子句

insert into month_days(month_, days_)
values
(to_char(add_months(to_date('20200112', 'YYYYDDMM'), i), 'Month'),
to_char(last_day(add_months(to_date('20200112', 'YYYYDDMM'), i)), 'DD'))
returning month_,days_ into months,days;

returns子句可以将insert语句中使用的任何数据作为变量返回到pl / sql(非常类似于稍后在代码中使用的select into语句)。 使用此代码,您不再需要select into和cnt列。

我也不知道你是否在课堂上学过“for”语句,但我建议你使用循环,递增I和IF语句 - 为声明更短,更容易阅读。您可以阅读有关“for loop”here

的文档

希望这有所帮助,并随时提出进一步的问题,我希望以一种促进未来良好习惯的方式帮助你做到这一点。我真的不喜欢回答作业类型的问题,但如果我能帮你理解发生了什么,我会的。