テーブル'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制約が使い物にならんな…
PR
1 | $db = Zend_Db::factory( 'Oracle' , $params ); |
2 | $insert_array = array ( |
3 | 'id' =>1 |
4 | , 'text' => '' |
5 | ); |
6 | $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制約が使い物にならんな…
トラックバック
トラックバックURL: