供参考:http://bbs.csdn.net/topics/390680263 的#3
解决方案 »
- oracle插入大量图片的问题
- 執行Oracle store Procedure時報錯:Object variable or With block variable not set
- ORACLE能解决这问题的人就算牛。
- 如何写一段SQL,例如A已先执行查询操作,B执行查询操作不能看到A查询的结果呢?
- 升级了,散分 5:30下班结贴
- 一存储过程调试编译无反应,而其他的则一切正常,盼解决之
- 100分解决oracle小错误,搞定就结贴
- for cursor_a in cursor_test loop这样的命名规则可取吗?
- 55555555,我受不了了~~~~~~~~~
- 向数据库发展的迷惑,请高手们解答,500分以上等待满意答案!!!
- 虚拟机安装oracle的进程问题
- 求救-数据转换问题
select t.tname, WMSYS.WM_CONCAT(b.g_name)
from tb1 t
left join tb2 b
on instr(',' || t.g_id || ',', ',' || b.g_id || ',') > 0
group by t.tname
PUT_DELIMITER IN VARCHAR2,
FIND_STR IN VARCHAR2)
RETURN VARCHAR2
/*
功能:用于将一行中存在多个值的数据分别转换为另一个对应的值。。如:'1,2,3'转换为:'一,二,三'
Put_str 是输入的字符串值,如:1,2,3
Put_delimiter 是分割符 ,如:','
find_str 是想要找的字符串
编写时间:2014-01-26
*/
AS
I INT := 1;
J INT := 0;
LEN1 INT := 0;
LEN2 INT := 0;
P_STR1 VARCHAR2(1000);
P_STR2 VARCHAR2(1000);
BEGIN
P_STR1 := TRIM(BOTH PUT_DELIMITER FROM PUT_STR);
LEN1 := LENGTH(P_STR1);
J := INSTR(P_STR1, PUT_DELIMITER, I);
IF J = 0 THEN
SELECT GNAME INTO P_STR1 FROM GROUP1 WHERE GROUP_ID = P_STR1;
RETURN P_STR1;
END IF;
WHILE J > 0 LOOP
SELECT GNAME
INTO P_STR2
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I, J - 1);
P_STR1 := P_STR1 || ',' || P_STR2;
I := J + 1;
J := INSTR(P_STR1, PUT_DELIMITER, I);
IF j=0 THEN
GOTO here;
END IF;
END LOOP;
<<here>>
RETURN P_STR1;
END;
供参考:http://bbs.csdn.net/topics/390680263 的#3这样的语句我理解不了。照抄的话没有进步。我试过这样的语句,20000行的数据量,执行时间十几分钟都执行不出结果。
PUT_DELIMITER IN VARCHAR2,
FIND_STR IN VARCHAR2)
RETURN VARCHAR2
/*
功能:用于将一行中存在多个值的数据分别转换为另一个对应的值。。如:'1,2,3'转换为:'一,二,三'
Put_str 是输入的字符串值,如:1,2,3
Put_delimiter 是分割符 ,如:','
find_str 是想要找的字符串
编写时间:2014-01-26
*/
AS
I INT := 1;
J INT := 0;
LEN1 INT := 0;
LEN2 INT := 0;
P_STR1 VARCHAR2(1000);
P_STR2 VARCHAR2(1000);
P_STR3 CLOB;
V_COUNT NUMBER(2);
BEGIN
P_STR1 := TRIM(BOTH PUT_DELIMITER FROM PUT_STR);
P_STR3 := '';
LEN1 := LENGTH(P_STR1);
J := INSTR(P_STR1, PUT_DELIMITER, I); IF J = 0 THEN
SELECT GNAME INTO P_STR3 FROM GROUP1 WHERE GROUP_ID = P_STR1;
RETURN P_STR3;
END IF;
/*
思路:当J>0时,说明是组合值。
1、取第一个值对应的组名是否为空,为空,取下一个值。不为空,取值后,循环下一个值
2、第二个值是否为空,为空,是否有下一个值,有,则取值,判断是否有一下个值。
*/
WHILE J > 0 LOOP
SELECT COUNT(*)
INTO V_COUNT
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I, J - I);
IF V_COUNT > 0 THEN
SELECT GNAME
INTO P_STR2
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I, J - I);
I := J + 1;
J := INSTR(P_STR1, PUT_DELIMITER, I);
P_STR3 := P_STR2 || ',' || P_STR3;
IF J > 0 THEN
SELECT COUNT(*)
INTO V_COUNT
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I, j - i);
IF V_COUNT > 0 THEN
SELECT GNAME
INTO P_STR2
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I,j - i);
P_STR3 := P_STR2 || ',' || P_STR3;
END IF;
END IF;
END IF;
I := J + 1;
J := INSTR(P_STR1, PUT_DELIMITER, I);
IF J = 0 THEN
SELECT GNAME
INTO P_STR2
FROM GROUP1
WHERE GROUP_ID = SUBSTR(P_STR1, I);
P_STR3 := P_STR2 || ',' || P_STR3;
END IF;
END LOOP;
RETURN P_STR3;
END;