請各路高人指點一二啊:
來個例子:
   前提: TableA 內有學號,班級,姓名三個欄位
   現在需要通過傳入的“學號”查詢這些學號是否屬於同一個“班級”,可能傳入的“學號”數量不定,可能是3個,也可能是5個; 所以我想講傳入的“學號”先行加工成可直接使用的狀態,可以不用截取就直接拿來查詢,如:'ID1','ID2','ID3','ID4' 作為EMP varchar2 傳入procedure:
   CREATE OR REPLACE PROCEDURE TEST_TEST_TEST(EMP IN VARCHAR2,COMMAND1 OUT VARCHAR2)AS
   S_CLASS VARCHAR2(25); 
   
   Procedure內進行查詢: 
    SELECT DISTINCT 班級 INTO S_CLASS      
      FROM TableA     
     WHERE 學號 IN (EMP);
--------------------------
  這裡就出錯了,我看了應該是將我的整個EMP作爲了一個“學號”來查詢了;  請問大家有沒有什麽辦法直接使用我想的這樣的加工過的多個“學號”在一個SQL語句里進行查詢么?需要各位的幫助,感謝大家的幫忙!!!

解决方案 »

  1.   

    你传进来的 'ID1','ID2','ID3','ID4' 会被当作4个参数的
    你可以传'ID1,ID2,ID3,ID4' 进来用 in (select regexp_substr('ID1,ID2,ID3,ID4','[^,]+',1,level) from dual connect by level<=4)
    来处理 
      

  2.   

    你可以直接拼接成这个字符串str = 學號 IN ('ID1','ID2','ID3','ID4' );写SQL的时候这么写    SELECT DISTINCT 班級 INTO S_CLASS      
          FROM TableA     
         WHERE  str || ' and 1' != '1'
      

  3.   


    這個方法有效哦!改成直接傳入字符串(ID1,ID2,ID3,ID4)。
    但是恕我愚昧,level後面的比較值定一個很大的數有關係么?比如300?因為我不能確定傳入的學號數量可能是多少,有可能幾十個,甚至上百...
      

  4.   

    创建type,
    把你的procedure的参数设置成type变量
      

  5.   

    可以使用集合构造伪表create or replace type var_array is table of varchar2(50);
    create or replace function f_str2tab(in_str varchar2)return var_array
    as
    v_str varchar2(32767):= in_str||',';
    v_result var_array := var_array();
    i number;
    begin
      loop
        exit when v_str is null;
        i:= instr(v_str,',');
        v_result.extend;
        v_result(v_result.count):=trim(substr(v_str,1,i-1));
        v_str := substr(v_str,i+1);
      end loop;
      return v_result;
    end;select * from table(f_str2tab('1,2,3'));
    COLUMN_VALUE
    --------------------------------------------------
    1
    2
    3过程里这么写
    SELECT DISTINCT 班級 INTO S_CLASS      
           FROM TableA     
          WHERE 學號 IN (select * from table(f_str2tab(EMP)));
      

  6.   

    补充一点:record类型也可以满足,和 C的数组一样
      

  7.   

    执行动态sql好了,execute immediate your_sql_string. 把你传入的id,拼接成一个sql语句的字符串your_sql_string。不知这方法行不?