oracle有关游标的知识

一:前言

      今天我自己第二次写游标,我擦,觉得自己在数据库方面需要很大的提高啊。今天遇到三个问题,第一个是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 is
v_names varchar2(4000);
n varchar2(2000);
v_code varchar2(100);
 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 = 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!

 

posted @ 2014-08-06 16:58  郁闷的耗子  阅读(268)  评论(0编辑  收藏  举报