2012-11-01 3 views
2

Question PL/SQL simple d'un débutant: Quelle est la syntaxe PL/SQL appropriée pour créer une nouvelle variable dans un ensemble de données existant?création de variables en PL/SQL

Je souhaite extraire l'année d'un champ de date (svcdat) dans un jeu de données de sinistres d'assurance (rpt_claim). Le champ de date est numérique et suit le format AAAAMMJJ, par exemple 20120704 pour 4 Juillet 2012.

Ma première passe à la création d'une variable « année » a échoué:

declare 
    year number(4); 
begin 
    select svcdat into year 
    from rpt_claim 
    where year=floor(svcdat/10000); 
end; 

Toute aide est très appréciée!

Répondre

1

Pour extraire l'année à partir d'une date, vous utiliserez probablement la fonction extract, mais avant cela, lorsque vous stockez vos dates sous forme de nombres, vous devez les convertir au type de données date en utilisant la fonction to_date. Voici un exemple (oracle 11g est utilisé):

-- 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 

Note, dans l'exemple ci-dessus la requête renvoie 1 (première sélectionnée) la ligne, parce qu'il a été spécifiquement demandé (where rownum = 1) de le faire. Dans votre cas, plus d'un enregistrement sera probablement retourné par la requête et pour gérer cela, vous devrez utiliser cursors et cursor FOR loop (par exemple) pour traiter les données retournées ou collections.

Voici un exemple d'utilisation de 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 
+0

fantastique, très utile. Merci Nicholas! – RobertF