各位好:
    我在程序中现在有这样的一个逻辑
     exec sql1 --> result
 
     if(result == null)
   exec sql2 --> result
 
     if(result == null)
   exec sql3 --> result
 
     if(result == null)
   exec sql4 --> result
 
     return result
     
     ......程序中这样实现,但是发现数据库交互的次数太多,效率问题立马凸现出来,能不能把上面的逻辑用sql语句实现,或者有什么好的建议和方法,请教大家.谢谢.

解决方案 »

  1.   

    哦?函数,存储过程没学过的说,那就是说sql语句不行了?
      

  2.   

    create or replace procedure proc(p_cur out sys_refcursor)
    as
    v_count number;
    begin
    select count(1) into v_count from ..... ;--sql1
    if v_count>0 then 
      open p_cur for (select ..... from ... where ...);--sql1
      return;
    end if;
    select count(1) into v_count from ...;--sql2
    if v_count>0 then
      open p_cur for (select ..... from ... where ...);--sql2
      return;
    end if;
    ...end proc;
      

  3.   

    我还有不明白的是这里的存储过程能像sql那样执行吗,返回我想要的一个数组值?不行的话应该怎样做就能返回我想要的值,麻烦高手继续指导,谢谢了.
      

  4.   

    上面的存储过程通过游标p_cur传出结果集。不知道你用的前台程序是怎么处理这个结果的
    也可以将上面的过程改成一个函数,一次判断所有的条件
    create or replace function func return number
    as
    v_count number;
    begin
    select count(1) into v_count from ..... ;--sql1
    if v_count>0 then   return 1; --返回结果1
    end if;
    select count(1) into v_count from ...;--sql2
    if v_count>0 then
      
      return 2;  --返回2
    end if;
    ...end func;
    然后再通过返回的值由前端确定运行哪一个sql
    比如上面的函数返回结果1,运行sql1。返回2,运行sql2..
    之后怎么处理就跟先前的一样
      

  5.   

    我以前程序是如果sql1执行有结果返回值,如果沒结果执行sql2,如果sql2值返回值,没有继续....这样的,我就想把这个逻辑用一个sql实现,游标那个实在不懂,怎么能把值返回给我的程序中啊?谢谢(我java开发)
      

  6.   

    Connection con = getConnection();
    proc = con.prepareCall(strSql);
    proc.execute();
    ResultSet rs = (ResultSet)proc.getObject(1);
    是这样获取结果的吗?
    谢谢.
      

  7.   

    我不会java,怎么取结果集我回答不了你
    先用存在性判断逻辑,要执行那一条sql,7楼的代码就是为了这个目的。根据返回的结果去调用相应的sql。比如这个函数返回结果为1,则执行sql1,不会出现结果集为空的情况。如果返回结果为2,直接执行第二条sql。
    这个函数可以优化下,只判断存在性应该会更快一点
    create or replace function func return number
    as
    v_count number;
    begin
    select nvl(max(1),0) into v_count from dual where exists(
      select 1 from a where .......) ;--sql1
    if v_count>0 then   return 1; --返回结果1
    end if;
    select nvl(max(1),0) into v_count from dual where exists(
      select 1 from b where .......) ;--sql2
    if v_count>0 then
      
      return 2;  --返回2
    end if;
    ...end func;执行一次select func from dual;来取得应该运行哪条sql的判断,再执行相关sql
    函数可以加几个传参来传入条件
      

  8.   

    非常感谢wildwave......今天从同事哪里得到了我入职三年来第一次听到公司规定开发不允许使用存储过程...狂汗啊..不过还是要非常感谢你wildwave.
      

  9.   

    。。那就没办法了
    pl/sql程序块就是为了减少你说的交互而用的