select *  from user_tab where user_id =arraylist传值给user_id 的是个动态数组可以吗?
如果arraylist里有2个值,一个是1,一个是2,则select 语句就查询user_id=1和user_id =2的所有信息
如果有3个值,select就在三个值之间查询所有信息
不知道我说明白没有
谢谢

解决方案 »

  1.   

    直接这样不行。可以考虑将数组拆分,然后拼凑成 in list
    select *  from user_tab where user_id in (……);
    但ORACLE对in列表有个数限制,最多1000个值。
      

  2.   

    SQL> create or replace type myvarray_list as varray(10) of varchar2(50);
      2  /类型已创建。SQL> create or replace procedure show_list(
      2  p_varlist in myvarray_list
      3  )
      4  is
      5  str varchar2(50);
      6  begin
      7  for x in 1..p_varlist.count loop
      8  dbms_output.put_line('p_varlist('||x||')='||p_varlist(x));
      9  end loop;
     10  end;
     11  /过程已创建。SQL> exec show_list(myvarray_list('Oracle','DB2','Sql Server','mySql','DBA'));
    p_varlist(1)=Oracle
    p_varlist(2)=DB2
    p_varlist(3)=Sql Server
    p_varlist(4)=mySql
    p_varlist(5)=DBAPL/SQL 过程已成功完成。
      

  3.   

    不管怎样,都得用到PL/SQL,PL/SQL里可以使用数组的咯。
      

  4.   

    谢谢楼上朋友帮忙!我是使用plsql来做的!但还是不知道如何使用数组
      

  5.   

    如果是number型元素的数组,可以这么做:字符串型数组没试过哈。
    create or replace type numTableType as table of number 
    / --这个函数,是把输入得字符串如'1,2,3,4'转换成number数组
    create or replace function str2numList(
    p_string in varchar2 
    ) return numTableType 
    as 
    v_str long default p_string || ','; 
    v_n number; 
    v_data numTableType := numTableType(); 
    begin 
    loop 
    v_n := to_number(instr( v_str, ',' )); 
    exit when (nvl(v_n,0) = 0); 
    v_data.extend; 
    v_data(v_data.count) := ltrim(rtrim(substr(v_str,1,v_n-1))); 
    v_str := substr(v_str, v_n+1); 
    end loop; 
    return v_data; 
    end;
    /--
    create or replace procedure proc_get_favorite(
    in_session_key IN dat_ct_user_session.session_key%TYPE,
    in_series_id_lst IN varchar2,
    in_resolution IN dat_ct_series_status.resolution%TYPE,
    out_cr_favorite OUT SYS_REFCURSOR,
    out_flag OUT number
    )
    AS
    begin
    update dat_ct_user_session set last_access_time = SYSTIMESTAMP where session_key = in_session_key; if SQL%NOTFOUND then
    out_flag := -1;
    else
    open out_cr_favorite for
    select ss.series_id,s.series_name,ss.max_chapter_no,ss.end_status from dat_ct_series s,dat_ct_series_status ss
    where s.series_id = ss.series_id
    and s.status = 'A'
    and ss.resolution = in_resolution
    and ss.series_id in( --这里面的 THE是关键。
    select * from 
    THE (select cast(str2numList(in_series_id_lst) as numtableType) from dual) 
          )
    order by s.init_letter,s.series_name; 
    out_flag := 0;
    end if; Exception when others then
    raise;
    end proc_get_favorite;
    /
      

  6.   

    ORACLE有一本专门的面向对象编程的官方文档。Application Developer's Guide - Object-Relational Features建议你看看。如果嫌英文太繁,看看《精通Oracle 10g PlSQL编程》PDF版,浅显,全面,通俗,易懂!
      

  7.   


    数组拆分,用逗号连接,付给变量。然后用动态语句执行查询。
    for example:delcare
    v_sql varhcar2(1000):= null;
    i number :=0;
    type user_list is table of varchar2(50);
    user_name_list user_list; --值我就不赋了。仅做说明。
    begin
    for i in 1..user_name_list.count
    loop
    v_sql := v_sql || user_name_list(i);
    end loop;execute immediate 'select * from table_name where user_name in ('||v_sql||')';end;
      

  8.   

    C#不能调存储过程吗?
    你也可以把那条select拿到你的c#里面啊。
      

  9.   

    谁能具体帮我写一下吗?磕头拜谢了!首先: 我在窗体datagridview上选择了多行,将new_order_no列数据获取并放到arraylist中,
    然后:我希望的是 select * from ksdz_wo_head1 where new_order_no in(数组arraylist);
    这样将数据查询出来!
    谢谢了!
    解决了再加100分答谢
      

  10.   


    你用循环遍历数组,拼接where后面的sql语句,你可以选择in也可以选择or
      

  11.   

    10g中,如果是nested table,可以用member of, varray的话用in (select * from table(arraylist))
      

  12.   

                string strsql = "";
                string newno=null;
                for (int i = 0; i < alist.Count; i++)
                {
                    if (i == 0)
                    {
                        newno = "'"+alist[0].ToString()+"'";
                    }
                    else
                    {
                        newno += ','+"'"+ alist[i].ToString()+"'";
                    }
                    strsql = "select * from ksdz_wo_head1 where new_order_no in ("+newno+")";
                }我已经解决了!谢谢大家的指点和帮忙!我就是用拼接的方式来得到sql语句的!下面执行这个sql语句就可以了