忍者ブログ
ZF1.11 Zend_DbでOracleに空文字列をインサートできない
テーブル'table'の'text'列にはNOT NULL制約を設定しています。

	$db = Zend_Db::factory('Oracle', $params);
	$insert_array = array(
		 'id'=>1
		,'text'=>''
	);
	$db->insert('table', $insert_array);

> ORA-01400: ("table"."text")にはNULLは挿入できません。

なにそれふざけてるの。


何処で例外が発生するかというと
 Zend_Db_Statement_Oracle::_executeのoci_execute()です。
が、実際に問題となる部分は
 @oci_bind_by_name($this->_stmt, $name, $params[$name], -1)
です。
ここで
 @oci_bind_by_name($this->_stmt, ':hoge', '', -1)
という関数が発行され、バインドする値として''が設定されます。

本来NOT NULL制約のカラムに''は当然インサートできるのですが、Oracleは
Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。
という信じ難い出鱈目な実装が行われているため、''をインサートすることができません。


最初Zend_Dbのアダプタか設定オプションの問題かと思ってたら実はOracleそのものの欠陥だったでござる。

アダプタを介さずに、直接手動でSQLを発行してもORA-01400エラーが発生します。
これはNOT NULL制約が使い物にならんな…
PR


2011/04/26 23:45 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<馬鹿「都合が悪いから載せなかったなどという妄想は決して抱かないようにね!(キリッ」 | HOME | 買ったものリスト 2011/04/24>>
忍者ブログ[PR]カード バイク買取