Fellow DBIers,

This query:

    $dbh->selectrow_hashref(q{
        SELECT c.change_id
             , COLLECT(t.tag) AS tags
          FROM changes   c
          LEFT JOIN tags t ON c.change_id = t.change_id
         WHERE c.project = ?
         GROUP BY c.change_id
    }, undef, 'engine');

Generates this (useless) exception:

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

However, I can make the error go away by removing the use of placeholders. This 
version does not throw an error:

    $dbh->selectrow_hashref(q{
        SELECT c.change_id
             , COLLECT(t.tag) AS tags
          FROM changes   c
          LEFT JOIN tags t ON c.change_id = t.change_id
         WHERE c.project = 'engine'
         GROUP BY c.change_id
    });

I can also eliminate the error by removing the COLLECT() line, but I really 
want an array there. Curiously, the error also goes away if I first execute 
without a placeholder and then with. IOW, this does not error out, either:

    $dbh->selectrow_hashref(q{
        SELECT c.change_id
             , COLLECT(t.tag) AS tags
          FROM changes   c
          LEFT JOIN tags t ON c.change_id = t.change_id
         WHERE c.project = 'engine'
         GROUP BY c.change_id
    });
    $dbh->selectrow_hashref(q{
        SELECT c.change_id
             , COLLECT(t.tag) AS tags
          FROM changes   c
          LEFT JOIN tags t ON c.change_id = t.change_id
         WHERE c.project = ?
         GROUP BY c.change_id
    }, undef, 'engine');

WTF Oracle?

Thanks,

David

Reply via email to