首页 > 代码库 > oracle有关游标的知识

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 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!