为什么wm_concat(distinct deptno) 在过程中不能使用呢?~很奇怪,单纯的SQL中是合适的~

贝鱼 2011-02-24 09:42:22
...
open c for
select wm_concat(distinct ..) from ..
...
在过程中为什么不能使用呢?~
错误:PL/SQL: ORA-30482: DISTINCT option not allowed for this function
...全文
2377 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝鱼 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hyee 的回复:]
是因为PL/SQL语法不支持静态SQL中包含在自定义聚集函数内部使用distinct语法,wm_concat属于自定义聚集函数的一种,因为它调用了Oracle data cartridge接口。

你可以改为使用动态SQL.
[/Quote]
明白了~
minitoy 2011-02-24
  • 打赏
  • 举报
回复
貌似cursor中的确不成.绕道吧
SQL> declare
2 v_ch varchar2(100);
3 cv_1 sys_refcursor;
4 begin
5 open cv_1 for select wm_concat(distinct substr(t.ename,1,1)) name from emp t;
6 loop
7 fetch cv_1 into v_ch;
8 exit when cv_1%notfound;
9 dbms_output.put_line(v_ch);
10 end loop;
11 end;
12 /

declare
v_ch varchar2(100);
cv_1 sys_refcursor;
begin
open cv_1 for select wm_concat(distinct substr(t.ename,1,1)) name from emp t;
loop
fetch cv_1 into v_ch;
exit when cv_1%notfound;
dbms_output.put_line(v_ch);
end loop;
end;

ORA-06550: 第 6 行, 第 22 列:
PL/SQL: ORA-30482: DISTINCT 选项在此函数中禁用
ORA-06550: 第 6 行, 第 15 列:
PL/SQL: SQL Statement ignored

SQL> set serveroutput on
SQL>
SQL> declare
2 v_ch varchar2(100);
3 v_num number;
4 cv_1 sys_refcursor;
5 begin
6 open cv_1 for select deptno, wm_concat(substr(t.ename,1,1)) name from (select distinct deptno,ename from emp) t group by deptno;
7 loop
8 fetch cv_1 into v_num, v_ch;
9 exit when cv_1%notfound;
10 dbms_output.put_line(v_num||' '||v_ch);
11 end loop;
12 end;
13 /

10 K,M,C
20 J,F,A,S,S
30 W,B,J,T,A,M

PL/SQL procedure successfully completed

SQL>
贝鱼 2011-02-24
  • 打赏
  • 举报
回复
单独的SQL语句执行是合适的,就是奇怪放在过程中就不能执行了,难道是过程中不允许这种操作~?
hyee 2011-02-24
  • 打赏
  • 举报
回复
是因为PL/SQL语法不支持静态SQL中包含在自定义聚集函数内部使用distinct语法,wm_concat属于自定义聚集函数的一种,因为它调用了Oracle data cartridge接口。

你可以改为使用动态SQL.
minitoy 2011-02-24
  • 打赏
  • 举报
回复
SQL> select wm_concat(distinct substr(t.ename,1,1)) from emp t 
2 group by deptno
3 union all
4 select wm_concat(substr(t.ename,1,1)) from emp t
5 group by deptno;

WM_CONCAT(DISTINCTSUBSTR(T.ENA
--------------------------------------------------------------------------------
C,K,M
A,F,J,S
A,B,J,M,T,W
C,K,M
S,F,A,S,J
A,B,M,T,J,W

6 rows selected

SQL>
minitoy 2011-02-24
  • 打赏
  • 举报
回复
SQL> select wm_concat(distinct substr(t.ename,1,1)) from emp t
2 group by deptno
3 union all
4 select wm_concat(substr(t.ename,1,1)) from emp t
5 group by deptno;

WM_CONCAT(DISTINCTSUBSTR(T.ENA
--------------------------------------------------------------------------------
C,K,M
A,F,J,S
A,B,J,M,T,W
C,K,M
S,F,A,S,J
A,B,M,T,J,W

6 rows selected

SQL>
minitoy 2011-02-24
  • 打赏
  • 举报
回复
[code=sql]SQL> select wm_concat(distinct substr(t.ename,1,1)) from emp t
2 group by deptno
3 union all
4 select wm_concat(substr(t.ename,1,1)) from emp t
5 group by deptno;

WM_CONCAT(DISTINCTSUBSTR(T.ENA
--------------------------------------------------------------------------------
C,K,M
A,F,J,S
A,B,J,M,T,W
C,K,M
S,F,A,S,J
A,B,M,T,J,W

6 rows selected

SQL> [code]
QKForex 2011-02-24
  • 打赏
  • 举报
回复
这种情况是由于
select wm_concat(distinct ..) from ..
选出的行数不唯一导致的
QKForex 2011-02-24
  • 打赏
  • 举报
回复
这种情况是由于
select wm_concat(distinct ..) from ..
选出的行数不为已导致的
minitoy 2011-02-24
  • 打赏
  • 举报
回复
代码贴全点
[code=SQL]SQL> select wm_concat(distinct substr(t.ename,1,1)) from emp t;

WM_CONCAT(DISTINCTSUBSTR(T.ENA
--------------------------------------------------------------------------------
A,B,C,F,J,K,M,S,T,W

SQL> [/CODE]
Phoenix_99 2011-02-24
  • 打赏
  • 举报
回复
distinct 不能用在wm_concat()这个函数里
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinglovebin 的回复:]
...
open c for
select wm_concat(distinct ..) from ..
...
在过程中为什么不能使用呢?~
错误:PL/SQL: ORA-30482: DISTINCT option not allowed for this function
[/Quote]是distinct 不能用在wm_concat()这个函数里
QKForex 2011-02-24
  • 打赏
  • 举报
回复
这种操作不允许,不是能不能的问题
DISTINCT option not allowed for this function

17,380

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧