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
Use the ecphp/doctrine-oci8-bundle to automatically configure the parameters.
If you prefer modifying the configuration, edit the doctrine.yaml as such:
doctrine:
dbal:
driver_class: EcPhp\DoctrineOci8\Doctrine\DBAL\Driver\OCI8\Driver
types:
cursor: EcPhp\DoctrineOci8\Doctrine\DBAL\Types\CursorType<?php
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' => 'database.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);
$stmt->execute();
/** @var $cursor EcPhp\DoctrineOci8\Doctrine\DBAL\Driver\OCI8\OCI8Cursor */
$cursor->execute();
while ($row = $cursor->fetch()) {
print_r($row);
echo PHP_EOL;
}
$cursor->closeCursor();
$stmt->closeCursor();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_RESOURCESto return the raw PHP resources.OCI8::RETURN_CURSORSto return theOCI8Cursorobjects 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
cp .env.example .envdocker-compose up -ddocker-compose exec php ./vendor/bin/phpunitCTRL+Cdocker-compose down