无法使用Symfony2连接Oracle数据库

3

我需要的内容

  • 我需要将Oracle数据库与Symfony2连接。

  • 我已经通过php -m进行了检查

    • oci8
    • pdo_odbc

    • odbc

这是我遵循的链接https://gist.github.com/johnkary/6481664

a.)config.yml

Doctrine配置

 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
    

错误:

 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);
    

输出

       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>)))
      

您请求的参数"database_host"不存在,导致出错。

我尝试了最后一种解决方案,但似乎并没有有效,我认为sf2中存在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%"]   

http://symfony.com/legacy/doc/doctrine/1_2/en/02-Connections - Abdulla Nilam
嗨,阿卜杜拉,他们提到了MySQL的连接而不是Oracle的连接。对于SF1,我想要与Oracle的SF2连接。 - afeef
尝试查看此链接:http://stackoverflow.com/questions/26942066/oracle-database-error-in-symfony2-doctrine-is-parameters-yml-setup-correctly 祝你好运! - Houssem ZITOUN
嗨housem,我已经谷歌了每个Oracle和SF2的单个页面链接,自从一周前我就在尝试解决这个问题。 - afeef
你可以看到我已经尝试过,但都徒劳无功。 - afeef
2个回答

0
这可能有点老了,但我认为它仍然有用。我正在开发一个连接到遗留的Oracle 11G数据库的Symfony 5项目。在大多数情况下,Doctrine运行良好。但在某些情况下,您需要执行原始查询。
您的env文件:
DATABASE_URL2="oci8://USERNAME:PASSWORD@HOSTNAME:1521/DATABASENAME"

注意:如果您使用的是Oracle 11G Express Edition,则数据库名称很可能是XE。
接下来,更新您的doctrine.yaml文件。在我的情况下,我有两个数据库。默认的是MySQL,第二个数据库是Oracle 11G。安装DoctrineExtensions包也是一个好主意,它可以为Doctrine中的Oracle和MySQL提供更多支持。
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

现在问题就变得棘手了。我的数据库没有任何主键,所以我必须手动添加它们到每个表中才能导入实体。一旦我导入了实体,我就会删除主键并手动更新实体。

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

现在你应该能够使用Doctrine来执行查询了。我喜欢使用仓库,所以不使用查询构建器。

示例:

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);
}

如果您需要执行原始查询:
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;
}

如果您需要在Mac上设置本地系统的帮助,可以使用此方法来设置Lando。请注意,我必须在AWS EC2上设置Oracle 11G,然后才能使用IMP工具导入我的转储文件。

如果您设置了RDS Amazon,则默认为Oracle 20或某个更新版本。 AWS RDS不支持从IMP进行旧备份。 RDS仅支持使用S3使用数据泵。

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


1
谢谢您的回答,但我已经解决了这个问题。非常感谢。 - afeef

0

这是我用来连接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

希望能有所帮助。


我需要在Oracle数据库连接方面的帮助。 - afeef
我需要连接Oracle,我认为必须有Oracle Oath包装器才能连接服务器端语言。 - afeef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接