当前位置: 代码迷 >> Oracle开发 >> Procedure 能直接使用傳入的 ('ID1''ID2''ID3''ID4')作為一個整的字符進行 IN 的查詢么?该怎么处理
  详细解决方案

Procedure 能直接使用傳入的 ('ID1''ID2''ID3''ID4')作為一個整的字符進行 IN 的查詢么?该怎么处理

热度:476   发布时间:2016-04-24 07:08:35.0
Procedure 能直接使用傳入的 ('ID1','ID2','ID3','ID4')作為一個整的字符進行 IN 的查詢么?
請各路高人指點一二啊:
來個例子:
   前提: 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語句里進行查詢么?

需要各位的幫助,感謝大家的幫忙!!!

------解决方案--------------------
你传进来的 '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)
来处理 
------解决方案--------------------
你可以直接拼接成这个字符串

str = 學號 IN ('ID1','ID2','ID3','ID4' );

写SQL的时候这么写

 

   SELECT DISTINCT 班級 INTO S_CLASS      
      FROM TableA     
     WHERE  str 
------解决方案--------------------
 ' and 1' != '1'




------解决方案--------------------
创建type,
把你的procedure的参数设置成type变量
------解决方案--------------------
可以使用集合构造伪表
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)));

------解决方案--------------------
补充一点:record类型也可以满足,和 C的数组一样
------解决方案--------------------
  相关解决方案