标签 OCI8 下的文章

让codeigniter的oci8 db driver支持insert_id()

php_mysql模块有一个函数:mysql_insert_id

功能是

mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier ,则使用上一个打开的连接。

说白了就是返回上一次insert的id号,但是oracle没有auto_increment属性,不能让字段自增,一般业内的解决方法是用sequence+trigger方案。今天需要取得oracle insert之后的id值,直接用上了codeigniter的$this->db->insert_id(),结果codeigniter报错提示:This feature is not available for the database you are using。我表示鸭梨很大,到底有好大?鸭梨山大:

/**
* Insert ID
*
* @access public
* @return integer
*/
function insert_id()
{
// not supported in oracle
return $this->display_error('db_unsupported_function');
}

既然都display_error了还返回的是interger。- -#
没办法codeigniter支持的数据库是主流的mysql,oracle是被抛弃的小孩。我们只能自己将其抚养成人了。
insert_id代码修改为:

function insert_id($tbl='')
{
$sql = "select " . $tbl . "_seq.currval as id from dual";
$statement = @ociparse($this->conn_id, $sql);
$row=@ociexecute($statement);
@ocifetchinto($statement, $row, OCI_ASSOC);
return $row['ID'];
}

加了一个$tbl参数,因为必须要传递$tbl,才能知道要查询的sequence,而且sequence要有一定的命名规范,比如:tablename_seq。

#167 codeigniter oci8 database driver do not support setting charset and session_mode while ocilogon() to oracle db

system/database/drivers/oci8/oci8_driver.php line 80 db_connect() function did not support set the charset and session mode while connecting to oracle db.

function db_connect()
    {
        return @ocilogon($this->username, $this->password, $this->hostname);
    }
function db_pconnect()
    {
        return @ocilogon($this->username, $this->password, $this->hostname);
    }

here is the prototype of oci_connect( ocilogon improved version )

resource oci_connect ( string $username , string $password [, string $db [, string $charset [, int $session_mode ]]] )

codeigniter最新的2.0.1太蛋疼鸟。system/database/drivers/oci8/oci8_driver.php里面的db_connect()和db_pconnect()函数尽然不支持连接的时候设定字符集,因为函数的原形ocilogon(被oci_connect代替)支持设定charset和session_mode。还有codeigniter为啥要使用@ocilogon而非oci_connect呢?php官方说5.0.0以前的版本才使用ocilogon,codeigniter为了使用ocilogon不报warning还前面加上了"@"符号。但是codeigniter声称是支持php 5.1.6以及以后版本的php框架。有点搞不懂codeigniter的想法了。 没有版本,这个问题,只有通过hard coding修改oci8_driver.php文件的db_connect()和db_pconnect()函数为:

function db_connect()
    {
        return @ociplogon($this->username, $this->password, $this->hostname, $this->char_set);
    }
function db_pconnect()
    {
        return @ociplogon($this->username, $this->password, $this->hostname, $this->char_set);
    }

已经将这个问题提交到

bitbucket