2013-05-06 5 views
1

Я использую этот запрос с Perl DBI:Почему я получаю «ORA-00932: непоследовательные типы данных: ожидается - получил -» при использовании 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 = ? 
GROUP BY c.change_id 

DBI использует OCI подготовить это заявление, связать значение я прохожу, и получить результаты. Но Oracle почему-то не нравится. Выход ошибки:

 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 

Эта версия работает отлично. Почему Oracle не похож на подготовленный оператор с COLLECT()?

В случае его помощи here is a trace of the OCI-related calls извлечен через ora_verbose = 6 (h/t @bohica).

+0

теория, DBD :: Oracle ora_verbose = 6 может быть более информативным. – bohica

+0

Выполнено, хотя теперь оно работает. Попытка заставить его снова потерпеть неудачу. Будет обновлено это значение ... – theory

+0

Там мы идем. Пришлось перезапустить Oracle VM. Без разницы. – theory

ответ

1

Наконец-то появилось решение этой проблемы, благодаря некоторому копанию пользователя. Проблема заключалась не в замещающем; почему он работал без заполнителя на изображении VirtualBox, о котором я понятия не имею. Нет, вопрос был с COLLECT(). Кажется, что оба собираемых значения должны быть приведены к определенному типу, и результирующий массив также необходимо отнести к предварительно определенному типу данных массива. Просто так случилось, что мой код имеет пользовательский тип массива:

CREATE TYPE sqitch_array AS varray(1024) OF VARCHAR2(512); 

Так что я в состоянии получить запрос на работу литьем COLLECT() как так в:

CAST(COLLECT(CAST(t.tags as VARCHAR2(512))) AS sqitch_array) 
+1

Есть ли способ сделать это в одной строке? Что-то в строках 'CAST (COLLECT (CAST (t.tags как VARCHAR2 (512))) AS (varray (1024) OF VARCHAR2 (512)))'? –

+0

Я загадочно получил ORA-00932 с 'select different myid, myblobcolumn from mytable'. Снятие «отличительного» помогло. –