首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

Procedure 能直接使用傳入的 ('ID1''ID2''ID3''ID4'

2013-01-25 
Procedure 能直接使用傳入的 ('ID1','ID2','ID3','ID4')作為一

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


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

热点排行