2013年10月26日土曜日

[coffeescript]coffeescriptをコンパイルしてJavaScriptに変換

coffeeコマンドを使用してコンパイル(JavaScriptへの変換)を行う。

コンパイル方法

-c -> コンパイルを行う。
-w -> -cとセットで使うことでファイルを保存するたびに自動でコンパイルを行うことが出来る

2013年10月14日月曜日

[Oracle12c]auto incrementみたいな新機能

Oracle12cでは、auto incrementっぽいカラムを定義できるようなので試してみた。

auto incrementっぽいカラムを定義するには、下のSQLのように「generated as identity」を指定する。
-- 常に生成した値を設定する(明示的に値を設定しようとするとエラーとなる)
id number generated as identity not null

-- generatedの後にalwaysを指定すると、常に生成した値を使用する
-- デフォルト動作なので、上のオプション無しと同じ動きとなる
id number generated always as identity not null

-- by defaultを指定すると値の設定がない場合のみ、生成した値が設定されます。
-- on nullをby defaultの後に設定すると、挿入(更新)対象の値がnullの場合にも、生成した値が設定されます。
id number generated by default as identity not null

生成する値のルールは、オプションとして指定します。指定する値のルールはシーケンスオブジェクトと同じなので省略します。

初期値が100で、最大値が999でサイクルさせる場合の定義例
id number generated as identity(
  minvalue 100
  maxvalue 999
  cycle
  ) not null,

実行例

-- テーブル定義
create table test_table
(
  id number generated as identity(
  minvalue 100
  maxvalue 999
  cycle
  ) not null,
  name NVARCHAR2 (100) not null,
  primary key (id)
);

-- INSERTの実行結果
SQL> insert into test_table (name) values ('なまえ');

1 row created.

SQL> select id from test_table;

 ID
----------
       100

SQL> insert into test_table (name) values ('なまえ');

1 row created.

SQL> select id from test_table;

 ID
----------
       100
       101

always指定のカラムに対して値を設定しようとすると、以下の例外が発生する。
SQL> insert into test_table (id, name) values (999, 'name');
insert into test_table (id, name) values (999, 'name')
                        *
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

値ってどうやって生成している?

値の生成自体はテーブル作成時に裏で作成したシーケンスオブジェクトを使用して行っているようです。
このシーケンスオブジェクトは、単純に「drop table テーブル名」でテーブルを削除した場合ゴミとして残ってしまいます。
テーブル削除時に「purge」を指定してセットで削除してあげましょう。

2013年10月13日日曜日

[Oracle12c]defaultに指定できるようになったon null句

Oracle12cからは、default区に「on null」が指定できるようになったようだ。
このon nullは、insert文で挿入しようとしている値がnullの場合に、指定した値を挿入してくれます。

※defaultの場合は、insertで指定されていない場合のみ値を挿入してくれるけど、on nullを使用することで完全にnullを除外出来るようになる。
なお、on nullを指定するとnullが入ることがありえないので、not nullを指定しなくても暗黙的にnot nullになる。

create table文

以下のように、defaultの後にon null句を記述し、null時に代入する値を指定する。
create table on_null_test (
  id number not null,
  char_col char(1) default on null '0',    -- nullの場合は、「0」を代入する
  number_col number default on null 100,      -- nullの場合は、「100」を代入する
  primary key (id)
);

insert文を実行

-- 主キー以外は指定しない
INSERT INTO ON_NULL_TEST (id) values (1);
-- nullを代入
INSERT INTO ON_NULL_TEST (id, char_col, number_col) values (2, null, null);
-- null以外を代入
INSERT INTO ON_NULL_TEST (id, char_col, number_col) values (3, '1', 999);

実行結果

IDが1と2の行は、insertで項目を指定していない、nullを指定しているためデフォルトの値が挿入されている。
ID CHAR_COL NUMBER_COL
1 0                 100
2 0                 100
3 1                 999