oracle - 为什么在准备好的语句中使用 COLLECT() 时会得到 "ORA-00932: inconsistent datatypes: expected - got -"?

标签 oracle perl prepared-statement aggregate-functions dbi

我将此查询与 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 来准备此语句,绑定(bind)我传递的值,并获取结果。但由于某种原因,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)。

最佳答案

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

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

因此,我可以通过像这样转换 COLLECT() 来使查询正常工作:

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

关于oracle - 为什么在准备好的语句中使用 COLLECT() 时会得到 "ORA-00932: inconsistent datatypes: expected - got -"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407560/

相关文章:

regex - 如何使用 Perl 在文件中的两个时间戳之间搜索行?

perl - 如果 Perl 子例程花费太长时间,如何停止它?

arrays - 散列 perl 值中的数组

java - 无法在SQL中使用prepareStatement

php - 从使用 PHP 到 iPhone 的 MySQL 数据库的分数列表中获取排名

sql-server - 尝试从 SSRS 访问 Oracle DB 时出现 SSL/钱包错误

linux - ProC 提示 Linux (CentOS 7.3) 上的 undefined symbol

oracle - PLS_INTEGER 中的 PLS 代表什么?

mysql - 无法创建 WSO2 CEP RDBMS 数据源

MYSQL从存储过程中的准备语句获取更新的行数