2

初心者からの簡単な 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;

どんな助けでも大歓迎です!

4

1 に答える 1

1

日付から年を抽出するには、おそらく抽出関数を使用しますが、その前に、日付を数値として保存するため、 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
于 2012-11-01T20:25:11.650 に答える