比如一个简单的过程里面有如此SQL:
select * from table where id in (1,2,3,4)
如何在客户端传“1,2,3,4”这个参数到过程中,能让过程执行出上述效果???
因为传进来的是字符串,它会在外面包一层,看成一个字符串整体等待帮助!!!

解决方案 »

  1.   

    SQL> select * from ta;         A
    ----------
             1
             2
             3
             4SQL> create or replace procedure tc(g_sql varchar2)
      2  as
      3  l_sql varchar2(1000);
      4  l_cou int;
      5  begin
      6      l_sql:='select count(1) from ta where a in (';
      7      l_sql:=l_sql||g_sql||')';
      8      execute immediate l_sql into l_cou;
      9      dbms_output.put_line(l_cou);
     10      commit;
     11  end;
     12  /过程已创建。SQL> exec tc('1,2,3');
    3PL/SQL 过程已成功完成。
      

  2.   

    zmgowin兄,谢谢你热心回答 
    其实我主要是想要返回一个数据集
    oracle用的不太熟悉,我是想通过包传参数,返回数据集,具体代码如下 
    你能帮我看一下吗?或者给一个更好的方法!谢谢:
    create or replace package body pkg_getCmdTotal as
      procedure pr_getCmdTotal(AChkDate      in varchar2,
                               ACmdID        in varchar2,
                               AResultCursor out rc_CmdTotal
                               ) is                                         
      begin
        open AResultCursor for
          select x.cmd_owner,
                 x.whouse_id,
                 x.Area_Whouse_Name,
                 x.prod_id,
                 x.Prod_Name,
                 x.Spec,
                 x.cmd_num,
                 y.num,
                 y.use_num 
            from (select a.cmd_owner,
                         c.parent_id whouse_id,
                         c.whouse_name Area_Whouse_Name,
                         b.prod_id,
                         d.Prod_Name,
                         d.Spec,
                         sum(cmd_num) cmd_num
                    from wms_cmd a, wms_cmd_item b, wms_whouse c, trd_Prod d
                   where a.cmd_id = b.cmd_id
                     and a.cmd_whouse = c.whouse_id
                     and b.Prod_ID = d.Prod_ID
                     and a.cmd_type in (1, 2, 3, 4)
                     and a.cmd_id in (1, 2)
                     and a.send_chk_date <= to_date(AChkDate,'yyyy-mm-dd')
                     and a.cmd_id in (ACmdID)
                   group by a.cmd_owner,
                            c.parent_id,
                            c.whouse_name,
                            b.prod_id,
                            d.Prod_Name,
                            d.Spec) x,
                 wms_inventory_total y
           where x.cmd_owner = y.owner_id(+)
             and x.whouse_id = y.whouse_id(+)
             and x.cmd_owner = y.emissary_id(+)
             and x.prod_id = y.prod_id(+);
      end;
    end;
      

  3.   

    create or replace package body pkg_getCmdTotal as
      procedure pr_getCmdTotal(AChkDate      in varchar2,
                               ACmdID        in varchar2,
                               AResultCursor out rc_CmdTotal
                               ) is   
      vSql varchar2(2000);                         
    begin
        vSql :='
          select x.cmd_owner,
                 x.whouse_id,
                 x.Area_Whouse_Name,
                 x.prod_id,
                 x.Prod_Name,
                 x.Spec,
                 x.cmd_num,
                 y.num,
                 y.use_num 
            from (select a.cmd_owner,
                         c.parent_id whouse_id,
                         c.whouse_name Area_Whouse_Name,
                         b.prod_id,
                         d.Prod_Name,
                         d.Spec,
                         sum(cmd_num) cmd_num
                    from wms_cmd a, wms_cmd_item b, wms_whouse c, trd_Prod d
                   where a.cmd_id = b.cmd_id
                     and a.cmd_whouse = c.whouse_id
                     and b.Prod_ID = d.Prod_ID
                     and a.cmd_type in (1, 2, 3, 4)
                     and a.cmd_id in (1, 2)
                     and a.send_chk_date <= to_date('''||AChkDate||''',''yyyy-mm-dd'')
                     and a.cmd_id in ('||ACmdID||')
                   group by a.cmd_owner,
                            c.parent_id,
                            c.whouse_name,
                            b.prod_id,
                            d.Prod_Name,
                            d.Spec) x,
                 wms_inventory_total y
           where x.cmd_owner = y.owner_id(+)
             and x.whouse_id = y.whouse_id(+)
             and x.cmd_owner = y.emissary_id(+)
             and x.prod_id = y.prod_id(+) ';
        open aresultcursor for vsql;
      end;
    end;
      

  4.   

    发现游标可以传字符串,那问题就解决了,上面是分享!
    感谢zmgowin!