Получил задачу перевести готовое приложение с MySQL на Oracle. С Oracle никогда не работал, тут же столкнулся с массой проблем.
Но все проблемы постепенно преодолевались, и уже даже стали работать SELECT-ы, но вот с INSERT-ами проблема, затыкаюсь на строчках в COciCommandBuilder:
Код: Выделить всё
if(is_string($table->primaryKey) && ($column=$table->getColumn($table->primaryKey))!==null && $column->type!=='string')
{
$sql.=' RETURNING '.$column->rawName.' INTO :RETURN_ID';
$command=$this->getDbConnection()->createCommand($sql);
$command->bindParam(':RETURN_ID', $this->returnID, PDO::PARAM_INT, 12);
$table->sequenceName='RETURN_ID';
}
Если внимательно на него посмотреть, то видно, что в поле pass биндится значение myhashedpassword. Почему вылетает такое исключение - не могу понять.CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 1400 OCIStmtExecute: ORA-01400: cannot insert NULL into ("MYDB"."USERS"."PASS")
(/tmp/pear/download/PDO_OCI-1.0/oci_statement.c:142). The SQL statement executed was: INSERT INTO users (state, first_name, last_name, middle_name, company_name, sex, lang, gmt, avatar, login, pass) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8, :yp9, :yp10) RETURNING id INTO :RETURN_ID. Bound with :RETURN_ID=NULL, :yp0='ACTIVE', :yp1='NULL', :yp2='NULL', :yp3='NULL', :yp4='NULL', :yp5=NULL, :yp6=NULL, :yp7=NULL, :yp8='NULL', :yp9='admin4', :yp10='myhashedpassword'
Если закомментировать длину
Код: Выделить всё
$command->bindParam(':RETURN_ID', $this->returnID, PDO::PARAM_INT/*, 12*/);
Код: Выделить всё
CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 3131 OCIStmtExecute: Error while trying to retrieve text for error ORA-03131
(/tmp/pear/download/PDO_OCI-1.0/oci_statement.c:142). The SQL statement executed was: INSERT INTO users (state, first_name, last_name, middle_name, company_name, sex, lang, gmt, avatar, login, pass) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8, :yp9, :yp10) RETURNING id INTO :RETURN_ID. Bound with :RETURN_ID=NULL, :yp0='ACTIVE', :yp1='NULL', :yp2='NULL', :yp3='NULL', :yp4='NULL', :yp5=NULL, :yp6=NULL, :yp7=NULL, :yp8='NULL', :yp9='admin5', :yp10='myhashedpassword'
Ну и если я вообще убираю блок с :RETURN_ID, разумеется, я не получаю id вновь созданной записи в таблице.
Возможно, кто-нибудь сталкивался с такой проблемой? Получается, что при наличии :RETURN_ID бинды как-то смещаются относительно переменных. Драйвер некорректно работает?
phpinfo:
Используется Nginx + php-fpm, php версии 5.4.4oci8
OCI8 Support enabled
OCI8 DTrace Support disabled
OCI8 Version 2.0.8
Revision $Id: f04114d4d67cffea4cdc2ed3b7f0229c2caa5016 $
Oracle Run-time Client Library Version 12.1.0.1.0
Oracle Compile-time Instant Client Version 12.1
Directive Local Value Master Value
oci8.connection_class no value no value
oci8.default_prefetch 100 100
oci8.events Off Off
oci8.max_persistent -1 -1
oci8.old_oci_close_semantics Off Off
oci8.persistent_timeout -1 -1
oci8.ping_interval 60 60
oci8.privileged_connect Off Off
oci8.statement_cache_size 20 20
PDO_OCI
PDO Driver for OCI 8 and later enabled