初学者的简单PL / SQL问题:在现有数据集中创建新变量的正确PL / SQL语法是什么?
我想从保险索赔数据集(rpt_claim)中的日期字段(svcdat)中提取年份。日期字段为数字,格式为YYYYMMDD,例如2012年7月4日的20120704。
我创建“年”变量的第一步是失败的:
declare
year number(4);
begin
select svcdat into year
from rpt_claim
where year=floor(svcdat/10000);
end;
非常感谢任何帮助!
答案 0 :(得分:1)
要从日期中提取年份,您可能会使用extract函数,但在此之前,当您将日期存储为数字时,必须使用to_date函数将它们转换为日期数据类型。这是一个例子(使用oracle 11g):
-- For the sake of simplicity this table contains only one column.
SQL> create table rpt_claim(
2 date_col number(8)
3 )
4 /
Table created
SQL> insert into rpt_claim(date_col) values(20120704);
1 row inserted
SQL> commit;
Commit complete
SQL> declare
2 l_year number(4);
3 begin
4 select extract(year from to_date(date_col, 'yyyymmdd'))
5 into l_year
6 from rpt_claim
7 where rownum = 1;
8 dbms_output.put_line(to_char(l_year));
9 exception
10 when no_data_found
11 then dbms_output.put_line('No data has been selected');
12 end;
13 /
2012 --<-- result
PL/SQL procedure successfully completed
注意,在上面的示例中,查询返回1(第一个选定的)行,因为特别要求(where rownum = 1
)执行此操作。在您的情况下,查询可能返回多条记录,并处理您必须使用cursors和cursor FOR loop(例如)处理返回的数据或collections。
以下是使用集合的示例:
-- add more records
SQL> insert into rpt_claim(date_col)
2 select 20120704 + level
3 from dual
4 connect by level < = 5;
5 rows inserted
SQL> commit;
Commit complete
SQL> select * from rpt_claim;
DATE_COL
---------
20120704
20120705
20120706
20120707
20120708
20120709
6 rows selected
SQL> declare
2 type t_years is table of number(4);
3 l_year t_years;
4 begin
5 select extract(year from to_date(date_col, 'yyyymmdd'))
6 bulk collect into l_year
7 from rpt_claim;
8
9 if l_year is not empty
10 then
11 for i in l_year.first..l_year.last
12 loop
13 dbms_output.put_line(to_char(l_year(i)));
14 end loop;
15 else
16 dbms_output.put_line('No data has been selected');
17 end if;
18 end;
19 /
2012
2012
2012 --<-- our result
2012
2012
2012
PL/SQL procedure successfully completed