日付から年を抽出するには、おそらく抽出関数を使用しますが、その前に、日付を数値として保存するため、 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
。あなたの場合、おそらくクエリによって複数のレコードが返され、それを処理するには、カーソルとカーソル FOR ループ(たとえば) を使用して、返されたデータまたはコレクションを処理する必要があります。
コレクションの使用例を次に示します。
-- 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