2011年2月4日金曜日

Oracle11gからPL/SQLでのSEQUENCE採番が便利に

Oracle11gからは、PL/SQLでSEQUENCEオブジェクトを使って採番する際に、dual表を使ってSELECT文を実行する必要がなくなった。

実際のコードは、こんな感じに、採番した値をダイレクトに変数に代入できるようになった。
なんか、なんの違和感もない直感的なコードになってる気がする。
  1  declare
  2    num pls_integer;
  3  begin
  4    num := test_seq.nextval;
  5    dbms_output.put_line(num);
  6* end;
SQL>
SQL> /
2

PL/SQL procedure successfully completed.

ちなみに、これがOracle10gまでのコード。
やっぱり、select文って必要ないよな。
  1  declare
  2    num pls_integer;
  3  begin
  4    select test_seq.nextval into num from dual;
  5    dbms_output.put_line(num);
  6* end;
SQL>
SQL> /
3

PL/SQL procedure successfully completed.

Oracle10gで、11gの新機能を使ってみようとすると当然エラーとなる。
  1  declare
  2    num pls_integer;
  3  begin
  4    num := test_seq.nextval;
  5    dbms_output.put_line(num);
  6* end;
SQL> /
  num := test_seq.nextval;
                  *
ERROR at line 4:
ORA-06550: line 4, column 19:
PLS-00357: Table,View Or Sequence reference 'TEST_SEQ.NEXTVAL' not allowed in
this context
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored