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

该版本完美运行。为什么 Oracle 不喜欢带有 的准备好的语句COLLECT()

如果有任何帮助,这里是通过(h/t @bohica)提取的与 OCI 相关的调用的跟踪。ora_verbose = 6

4

1 回答 1

2

由于用户的一些挖掘,终于得到了这个问题的解决方案。问题不在于占位符;为什么它在 VirtualBox 图像上没有占位符的情况下工作我不知道。不,问题出在COLLECT(). 似乎收集的值都需要转换为特定类型,并且生成的数组也需要转换为预定义的数组数据类型。碰巧我的代码有一个自定义数组类型:

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

因此,我可以通过以下方式使查询正常工作COLLECT()

CAST(COLLECT(CAST(t.tags as VARCHAR2(512))) AS sqitch_array)
于 2014-06-02T18:03:40.637 回答