2

Perl DBIでこのクエリを使用しています:

SELECT c.change_id
     , COLLECT(t.tag) AS the_tags
  FROM changes   c
  LEFT JOIN tags t ON c.change_id = t.change_id
 WHERE c.project = ?
 GROUP BY c.change_id

DBI は OCI を使用してこのステートメントを準備し、渡した値をバインドし、結果を取得します。しかし、オラクルは何らかの理由でそれを好まない。エラー出力は次のとおりです。

     ORA-00932: inconsistent datatypes: expected - got - (DBD ERROR: error possibly near <*> indicator at char 41 in '
            SELECT c.change_id
                 , <*>COLLECT(t.tag) AS the_tags
              FROM changes   c
              LEFT JOIN tags t ON c.change_id = t.change_id
             WHERE c.project = :p1
             GROUP BY c.change_id
        '

あまり有益ではありません。ただし、呼び出しを変更するだけでなくCOLLECT()、プレースホルダーを実際の値に置き換えることで、このエラーを解消できます。

     SELECT c.change_id
          , COLLECT(t.tag) AS the_tags
       FROM changes   c
       LEFT JOIN tags t ON c.change_id = t.change_id
      WHERE c.project = 'tryoracle'
      GROUP BY c.change_id

そのバージョンは完全に機能します。オラクルが準備済みステートメントを好まないのはなぜCOLLECT()ですか?

参考までに、 (h/t @bohica)経由で抽出された OCI 関連の呼び出しのトレースを次に示します。ora_verbose = 6

4

1 に答える 1