Doctrine's OCI8 (Oracle) driver with cursor support.

1.0.0 2021-02-17 15:06 UTC


Latest Stable Version GitHub stars Total Downloads GitHub Workflow Status Scrutinizer code quality Type Coverage Code Coverage Read the Docs License

Doctrine OCI8 Driver

The Doctrine OCI8 driver with cursor support, for PHP >= 7.4.

This is a fork of the original package develpup/doctrine-oci8-extended from Jason Hofer.


composer require ecphp/doctrine-oci8


Symfony 5

Use the ecphp/doctrine-oci8-bundle to automatically configure the parameters.

If you prefer modifying the configuration, edit the doctrine.yaml as such:

        driver_class: EcPhp\DoctrineOci8\Doctrine\DBAL\Driver\OCI8\Driver
            cursor:  EcPhp\DoctrineOci8\Doctrine\DBAL\Types\CursorType



namespace App;

use Doctrine\DBAL\Types\Type;
use EcPhp\DoctrineOci8\Doctrine\DBAL\Types\CursorType;
use EcPhp\DoctrineOci8\Doctrine\DBAL\Driver\OCI8\Driver;

include __DIR__ .'/vendor/autoload.php';

// Register the custom type.
if (false === Type::hasType('cursor')) {
    Type::addType('cursor', CursorType::class);

$config = new Doctrine\DBAL\Configuration();
$params = [
    'dbname'      => 'database_sid',
    'user'        => 'database_username',
    'password'    => 'database_password',
    'host'        => '',
    'port'        => 1521,
    'persistent'  => true,
    'driverClass' => Driver::class, // This is where we load the driver.
$conn = Doctrine\DBAL\DriverManager::getConnection($params, $config);

$stmt = $conn->prepare('BEGIN MY_STORED_PROCEDURE(:user_id, :cursor); END;');
$stmt->bindValue('user_id', 42);
$stmt->bindParam('cursor', $cursor, \PDO::PARAM_STMT);

/** @var $cursor EcPhp\DoctrineOci8\Doctrine\DBAL\Driver\OCI8\OCI8Cursor */

while ($row = $cursor->fetch()) {
    echo PHP_EOL;



For OCI8 types that are not represented by PDO::PARAM_ constants, pass OCI8::PARAM_ constants as the type argument of bindValue() and bindParam().


Cursors can be specified as PDO::PARAM_STMT, OCI8::PARAM_CURSOR, or just 'cursor'. Only the bindParam() method can be used to bind a cursor to a statement.


Cursor resources returned in a column of a result set are automatically fetched. You can change this behavior by passing in one of these fetch mode flags:

  • OCI8::RETURN_RESOURCES to return the raw PHP resources.
  • OCI8::RETURN_CURSORS to return the OCI8Cursor objects that have not yet been executed.
use Doctrine\DBAL\Driver\OCI8\OCI8;

$rows = $stmt->fetchAll(\PDO::FETCH_ASSOC+OCI8::RETURN_CURSORS);
$rows = $stmt->fetchAll(\PDO::FETCH_BOTH+OCI8::RETURN_RESOURCES);

Special thanks to Michal Tichý for his patch.


In order to have a working development environment, tests are Docker based.

To run the tests, do the following steps

  1. cp .env.example .env
  2. docker-compose up -d
  3. docker-compose exec php ./vendor/bin/phpunit
  4. CTRL+C
  5. docker-compose down