忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/29 07:36 |
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() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



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