string - 在 Oracle 10g 上创建聚合函数返回无用的错误

标签 string oracle oracle10g aggregate-functions ora-06553

我得到了一些帮助并被引导到 this pagethis explanation ,其中应该包含一种有效的聚合方式。

建议使用 de COLLECT 函数和其他一些自定义的东西。我正在尝试适应它,但错误消息(加上我的新手)并不是最有帮助的。

功能:

CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000);

CREATE OR REPLACE FUNCTION tab_to_string (
    p_varchar2_tab  IN  t_varchar2_tab, 
    p_delimiter     IN  VARCHAR2 DEFAULT ',')
RETURN VARCHAR2 IS
  l_string     VARCHAR2(32767);
BEGIN
  FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
    IF i != p_varchar2_tab.FIRST THEN
      l_string := l_string || p_delimiter;
    END IF;
    l_string := l_string || p_varchar2_tab(i);
  END LOOP;
  RETURN l_string;
END tab_to_string;

我的测试:

with my_table as
(
    select 'user1' as usrid, 'ab' as prodcode from dual union
    select 'user1' as usrid, 'bb' as prodcode from dual union
    select 'user1' as usrid, 'a' as prodcode from dual union
    select 'user2' as usrid, 'db' as prodcode from dual union
    select 'user2' as usrid, 'b' as prodcode from dual union
    select 'user2' as usrid, 'bfdd' as prodcode from dual
)
select
    usrid, 
    tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes
from
    my_table
group by
    usrid

会给我一个ORA-06553: PLS-306: 调用“TAB_TO_STRING”时参数数量或类型错误

这几乎是我在开头提到的来源的复制粘贴,并且该功能对我来说很有意义......我错过了什么?

谢谢!

[编辑] Codo 发现问题之一是 Oracle 将 'a' 理解为 char,而不是 varchar。这就把问题带到了真正的问题上。我更新了它,以便它具有重点。

最佳答案

由于我不太明白的原因,Oracle 认为合成表的 PRODCODE 列不是 VARCHAR2 列。如果您稍微修改 PRODCODE 值之一,它将起作用:

with my_table as
(
    select 'user1' as usrid, 'ab' as prodcode from dual union
    select 'user1' as usrid, 'b' as prodcode from dual union
    select 'user1' as usrid, 'c' as prodcode from dual union
    select 'user2' as usrid, 'd' as prodcode from dual union
    select 'user2' as usrid, 'e' as prodcode from dual union
    select 'user2' as usrid, 'f' as prodcode from dual
)
select
    usrid, 
    tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes
from
    my_table
group by
    usrid

关于string - 在 Oracle 10g 上创建聚合函数返回无用的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553466/

相关文章:

Python 字符串格式 + UTF-8 奇怪的行为

Python检查多个字符串中是否有空字符串

oracle - Oracle SYS和SYSTEM帐户有什么区别?

oracle - Grails 3无法解析类oracle.sql

sql - Oracle 10g 中具有 CLOB 字段的表删除速度较慢

sql - 匹配多个名字

c - C中使用指针从字符串中提取子字符串

oracle - 物化 View 创建速度很快,但刷新需要几个小时

hibernate - JPA 实体基于同义词而不是表

java - 替换字符串 Java