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的数组一样
------解决方案--------------------