一:前言
今天我自己第二次写游标,我擦,觉得自己在数据库方面需要很大的提高啊。今天遇到三个问题,第一个是oracle数据库中的数据拆分的问题,这个我用regexp_substr来进行解决,第二个问题就是regexp_substr里面的参数,我没有成功的用select语句进行代替(我现在还不知道)。第三个是我写完游标竟然不知道怎么讲获取的值返回。苍天啊,大地啊。
下面进行详细说明;
二:
1、regexp_substr函数
REGEXP_SUBSTR(String, pattern, position, occurrence, modifier):
第一个参数:是需要进行匹配的字符串;
第二个参数:进行匹配的正则表达式;
第三个参数:起始位置,从第几个字符开始进行正则表达式的匹配。(默认为1)
第四个参数:表示匹配的第几个。默认也为1;
第五个参数:模式(“i”表示不区分大小写进行检索,"c"是区分大小写进行检索。默认的是“c”);
然后就是获取到我们自己想要查分后的结果:
、
上面的拆分就说到这,基本上就是照葫芦画瓢吧。
2、就是我想说的我想把那个第一个参数string用select 语句改写,但是没有改写成功。
select regexp_substr('3W,3X,5,57,58,0','[^,]+',1,level,'i') as str from dual connect by level <=length('3W,3X,5,57,58,0')-length(REGEXP_REPLACE('3W,3X,5,57,58,0',',',''))+1;
结果失败了。希望谁要是成功了告诉我下。
3、就是我现在得到了我想要的结果后,我们根据这拆分的数据在进行循环查询得到我们想要的数据,我得到是把循环的数据连载一起以字符串的形式返回。
所以这里我又要用到游标进行循环。
先给出错误的代码,那时我只是先写了游标,自己不知道怎么返create or replace function get_bclb(str in varchar2,v_group_code in varchar2)
create or replace function get_bclb(str in varchar2,v_group_code in varchar2)return varchar2 is v_names varchar2(4000);declare v_code pf_common_config.code%TYPE;n varchar2(2000); CURSOR c_cursor is select regexp_substr(str,'[^,]+',1,level,'i') as str from dual connect by level <=length(str)-length(REGEXP_REPLACE(str,',',''))+1;begin open c_cursor; loop fetch c_cursor into v_code; exit when c_cursor%NOTFOUND; select c.name into n from pf_common_config c where c.code = v_code and c.group_code = 'BCLB'; -- DBMS_OUTPUT.PUT_LINE('转换后的数据:'|| v_code||'='||n); v_names := v_names ||n||','; end loop; close c_cursor; -- DBMS_OUTPUT.PUT_LINE('转换后的数据:'||v_names); return v_names; end get_bclb;
最后修改成功的代码是:
create or replace function get_bclb(str in varchar2,v_group_code in varchar2)return varchar2 isv_names varchar2(4000);n varchar2(2000);v_code varchar2(100); CURSOR c_cursor isselect regexp_substr(str,'[^,]+',1,level,'i') as str from dualconnect by level <= length(str) - length(REGEXP_REPLACE(str,',',''))+1;begin open c_cursor; loop fetch c_cursor into v_code; exit when c_cursor%NOTFOUND; select c.name into n from pf_common_config c where c.code = v_code and c.group_code = v_group_code; -- DBMS_OUTPUT.PUT_LINE('转换后的数据:'|| v_code||'='||n); v_names := v_names ||n||','; end loop; close c_cursor; -- DBMS_OUTPUT.PUT_LINE('转换后的数据:'||v_names); return v_names;end get_bclb;
几天还有个函数:在计算年龄是用到了,自己就去查了下。Trunc((sysdate-csrq)/365,0) as age,这里就表是取整,如果是Trunc((sysdate-csrq)/365,2) 就表示两位小数。
三:自己现在在实习,每天虽然做的事情不是很多,我现在在做报表,但是我还是觉得自己是码农啊,这不是我想干的,我想学很多我自己不会的知识,而不只是在这天天敲代码。努力加油。学习,最近去学学Android吧。Go!Go!Go!