3
votes

what i need

  • i need to connect oracle database with symfony2.

  • i have checked by php -m

    • oci8
    • pdo_odbc

    • odbc

here is the link i follow https://gist.github.com/johnkary/6481664

a.)config.yml

Doctrine Configuration

 doctrine:
dbal:
    default_connection:   default
    connections:
        default:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  "%database_charset%"

b.) parameter.yml

  # If connecting via SID
 parameters:
database_driver:   oci8
database_host:     abc
database_port:     '1521'
database_name:     test
database_user:     aa
database_password: aa
database_charset:  AL32UTF8
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: en
secret: zzzz

c.)services.orcale.yml

 services:
acme.doctrine.dbal.events.oracle_session_init.listener:
    class: %doctrine.dbal.events.oracle_session_init.class%
    tags:
        - { name: doctrine.event_listener, event: postConnect }
acme.doctrine.dbal.oracle_platform.type_mapping.listener:
    class: Acme\MisBundle\Listener\OracleDoctrineTypeMappingListener
    tags:
        - { name: doctrine.event_listener, event: postConnect }
  • then run symfony database cmd

     php bin/console doctrine:database:create
    

error:

 cannot create database test for connection named default.
 notice: undefined index dbname
  • i have googled a day but i think there are few developer who works with symfony2 and oracle.

  • i had made simple php script that works to test connections

    $userName = ""; $password = ""; $dtabasePort = "1521"; $serverName = "";
    
    $databaseName = "testingdb";
    $c = oci_connect($userName, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ) (SID =)))');
    
     print_r($c);
    

output

       Resource id #3

tsnames.ora

    test=

       (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = sss)(PORT = 1521))
          (CONNECT_DATA = (SID = test))
         )
  • i have worked sf3 and mysql but im new to oracle thats why i don"t knew how to connect oracle db with symfony.

  • please give some solution where i have done wrong.

  • Can anyone suggest in steps how to connect oracle db with sf2/3 is most appreciated.

  • link of github relies same issue that im facing https://github.com/doctrine/dbal/issues/1564

    • i have also changed the parameter.yml file

       parameters:
       database_driver: oci8
       database_user: <user>
       database_password: <password>
       database_charset: WE8MSWIN1252
       database_name: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service_name>)))
      

then error you have requested non-existence parameter "database_host"

last & final solution i tried but didn"t worked i think there bug in sf2 for oracle

    parameters:

        database_driver: oci8    
        database_host: 
        database_port: 1521
        database_name: 
        database_user: 
        database_password: 
        domain_name: 

     doctrine:
        dbal:
            default_connection:   default
            connections:
                default:
                    driver:   "%database_driver%"
                    host:     "%database_host%"
                    port:     "%database_port%"
                    dbname:   "%database_name%"
                    user:     "%database_user%"
                    password: "%database_password%"
                    charset:  UTF8
                    persistent: true
        orm:
            auto_generate_proxy_classes: "%kernel.debug%"
            auto_mapping: true
    services:
         pdo:
            class: PDO
            arguments:
                - "oci8:Server=%database_host%;Database=%database_name%"
                - "%database_user%"
                - "%database_password%"
            calls:
                - [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION

         session.handler.pdo:
            class:     ESERV\MAIN\FrameworkChanges\MtlPdoSessionHandler
            arguments: ["@pdo", "%pdo.db_options%"]   
2
hi abdulla in there they mentioned connection for mysql not for oracle.& for sf1 i want sf2 connection with oracleafeef
Try to look at this stackoverflow.com/questions/26942066/… Good luck!Houssem ZITOUN
hi housem i have google every single page link oracale & sf2, im trying to solve this issue since 1 week backafeef
you could see in text i have also tried but all in vainafeef

2 Answers

0
votes

here is what I use to connect MSSQL : https://github.com/realestateconz/MssqlBundle

config.yml :

doctrine:
dbal:
    types:
        string: ***\BacsManagementBundle\Type\StringType
    default_connection: default
    connections:
        default: 
            host:     "%database_host%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            driver_class:   Realestate\MssqlBundle\Driver\PDODblib\Driver
            mapping_types:
                enum: string
                string: string

hope it helps.

0
votes

This might be a little old but I think it is still useful. I am working on a Symfony 5 project connected to a legacy Oracle 11G database. For the most part Doctrine works fine. In some cases you need to perform a raw query.

Your env file:

DATABASE_URL2="oci8://USERNAME:PASSWORD@HOSTNAME:1521/DATABASENAME"

Note: if you are using Oracle 11G Express Edition your database name most likely will be XE

Next update your doctrine.yaml file. In my case I have two databases. The default one is MySQL and the 2nd database is Oracle 11G. It would also be a good idea to install the DoctrineExtensions package that gives a little more support to Oracle and MySQL in Doctrine.

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                # configure these for your database server
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                mapping_types:
                    enum: string
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
            oracle:
                # configure these for your database server
                url: '%env(resolve:DATABASE_URL2)%'
                driver: 'oci8'
                server_version: '11'
                charset: AL32UTF8
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: default
        entity_managers:
            default:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                connection: default
                auto_mapping: true
                dql:
                    numeric_functions:
                        rand: DoctrineExtensions\Query\Mysql\Rand
                    datetime_functions:
                        DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            oracle:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                connection: oracle
                dql:
                    datetime_functions:
                        TO_CHAR: DoctrineExtensions\Query\Oracle\ToChar
                        TO_DATE: DoctrineExtensions\Query\Oracle\ToDate
                mappings:
                    Oracle:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Oracle'
                        prefix: 'App\Entity\Oracle'
                        alias: Oracle

Now this is where it gets tricky. My database does not have any primary keys so I had to add them manually to each table in order to import the entities. Once I imported the entities I then removed the primary keys and updated the entities manually.

php bin/console doctrine:mapping:import "App\Entity\Oracle" annotation --path=src/Entity/Oracle --em=oracle

You should now be able to use Doctrine to perform a query. I like using repositories so I do not use Query Builder.

Example:

public function getEmployeeInfo($clientID)
{
    $sql =
      "
      SELECT
        p.employeeId,
        p.clientId,
        p.firstname,
        p.lastname
        
      FROM
        Oracle:Phoneext p
        
      WHERE
        p.clientId = :clientID
      
      ORDER BY p.lastname ASC
      "
    ;
    $query = $this->getEntityManager()->createQuery($sql);
    $query->setParameter('clientID', $clientID);
    $results = $query->getResult();
    return ($results);
}

In a case you need to perform a RAW query:

public function getMultiStatusRowId($employeeID, $status, $date, $time, $em)
{
    $conn = $em->getConnection();

    $sql =
      "
      SELECT
        ROWIDTOCHAR(ROWID) as row_id
        
      FROM
        MULTI_STATUS
        
      WHERE
           EMPLOYEE_ID = ?
           AND  STATUS = ?
           AND IN_DATE = ?
           AND IN_TIME = ?
           
                   
      ORDER BY ORDER_NUM ASC  
      "
    ;

    $result = $conn->prepare($sql);
    $result->bindValue(1, $employeeID);
    $result->bindValue(2, $status);
    $result->bindValue(3, $date);
    $result->bindValue(4, $time);
    $result->execute();

    $data = array();
    $i = "0";
    while ($row = $result->fetch()) {
        $data[$i]['ROW_ID'] = $row['ROW_ID'];
        $i++;
    }
    return $data;
}

One final item if you need help setting up a local system on a Mac you can use this to help setup Lando. Note I had to setup Oracle 11G on AWS EC2 then was able to use the IMP tool to import my dump files.

If you setup RDS Amazon will default to Oracle 20 or some newer version. AWS RDS does not support the older backups from IMP. RDS will only support data pump using S3.

https://github.com/rsaylor73/lando-apache-php-mysql-oci8