テーブル'table'の'text'列にはNOT NULL制約を設定しています。
> 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制約が使い物にならんな…
$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
トラックバック
トラックバックURL: