2016-10-08 11 views
1

を使用してSymfony2のにOracleのメタデータをインポートしようとしたとき、私はsymfonyの2.8を使用してOracleに接続しようとしているが、私は私の既存のデータベースからエンティティを作成するためにメタデータを生成するSQLエラー教義

php app/console doctrine:mapping:convert xml ./src/Occidente/RspBundle/Resources/config/doctrine/metadata/orm --from-database --force 

を実行したときに、私を得ます次のエラーメッセージ:

警告:oci_fetch_all():ORA-01427:単一行のサブクエリが複数の行

答えて

1

を返し、私は、このISSを備えましたOracleデータベースからのインポートによるue。私はDoctrine/DBALをデバッグし、テーブルのメタデータをインポートするときに、all_col_comments Oracleメタデータテーブルのテーブルコメントを探します。これは、2つの異なるスキーマに2つのテーブルがある場合2人の異なる所有者)と全く同じテーブル名と列名を使用します。

Error message with debug enabled

私は、この(おそらく稀な)問題を修正するためのGitHub上の教義DBALリポジトリにpull requestを提出しました。回避策として、あなたは、スキーマのいずれかから、競合を引き起こしているテーブルを削除することができたり、プロジェクトのvendorディレクトリの下/lib/Doctrine/DBAL/Platforms/ディレクトリにOraclePlatform.phpファイルを編集し、次のようにgetListTableColumnsSQL機能を変更します。

/** 
* {@inheritDoc} 
*/ 
public function getListTableColumnsSQL($table, $database = null) 
{ 
    $table = $this->normalizeIdentifier($table); 
    $table = $this->quoteStringLiteral($table->getName()); 

    $tabColumnsTableName = "user_tab_columns"; 
    $colCommentsTableName = "user_col_comments"; 
    $ownerCondition = ''; 
    $innerOwnerCondition = ''; 

    if (null !== $database && '/' !== $database) { 
     $database = $this->normalizeIdentifier($database); 
     $database = $this->quoteStringLiteral($database->getName()); 
     $tabColumnsTableName = "all_tab_columns"; 
     $colCommentsTableName = "all_col_comments"; 
     $ownerCondition = "AND c.owner = " . $database; 
     $innerOwnerCondition = "AND d.OWNER = c.OWNER"; 
    } 

    return "SELECT c.*, 
        (
         SELECT d.comments 
         FROM $colCommentsTableName d 
         WHERE d.TABLE_NAME = c.TABLE_NAME 
         AND d.COLUMN_NAME = c.COLUMN_NAME " . $innerOwnerCondition . " 
        ) AS comments 
      FROM  $tabColumnsTableName c 
      WHERE c.table_name = " . $table . " $ownerCondition 
      ORDER BY c.column_name"; 
} 
+0

+ 1Hello I機能を変更し、完璧に動作します ありがとうカリムからコロンビア –

+0

@ChristianReyesArgottyよろしくお願いします。この質問への答えとして私の答えを記入してください:) – Francois