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