oracle存储过程 声明了个游标。查询语句 
select * from table where 姓名 in(joblist) joblist 是varchar2参数  传进来的 是 '张三','李四','王五'为什么测试跟踪 查不到数据呢。 sql语句直接查可以查到数据的啊。
存储过程里条件用in+参数 有啥说法么···

解决方案 »

  1.   

    你现在这种写法,参数'张三','李四','王五'传递到存储过程中,oracle会把它看成一个字符串,
    相当于:select * from xx in (' ''张三'',''李四'',''王五'' ')可以使用动态sql或者instr来处理。
      

  2.   

    oracle原来这样啊。这个字符串可能会比较长。请问稍微具体点用动态sql或者instr函数该如何处理呢。需要拆分这个字符串然后循环么
      

  3.   

    传入数组的话 可不可以呢   oracle还会当做 一个整串么
      

  4.   


    create or replace procedure procedure_name(
      i_str    varchar2,
      o_cursor sys_refcursor
    )as
    begin
      open o_cursor for 
        'select * from xx in ('||i_str||')';exception
      when others then
        null;
    end;
      

  5.   

    你好,我这边是 这样
    declare  
    cursor cur_stu is 
    select * from xx in (i_str);
    然后下边对这个游标循环操作到一个临时表里,最后才用sys_refcursor参数返回
    这里没办法像你那样写啊
     
      

  6.   


    --普通游标无法用动态sql,向临时表里面插入数据为什么用游标呢?
    --下面这样不行么。
    execute immediate 'insert into table_name select * from xx in('||i_str||')';
      

  7.   


    那你完全可以用,sys_refcursor 类型的游标进行逻辑处理,游标变量也是可以fetch的。
    open o_cursor for 
    'select * from xx in ('||i_str||')';fetch o_cursor into xxx;
    loop
      exit when o_cursor%NODATA_FOUND then exit;
      fetch o_cursor into xxx;
    end loop;close o_cursor;
      

  8.   


    CREATE OR REPLACE PACKAGE "PK_DEX_PUB" IS
        TYPE T_VARCHAR_TABLE IS TABLE OF VARCHAR2(100);
        /*
          分隔字符串返回varchar数组(支持多字符分隔字符串)
          STR                需要分隔字符串
          SPLIT_STR          分隔字符串
        */
        FUNCTION FUN_STR_SPLIT(STR IN VARCHAR2,SPLIT_STR VARCHAR2) RETURN VARCHAR2 ;
    END PK_DEX_PUB;
    /CREATE OR REPLACE PACKAGE BODY "PK_DEX_PUB" IS    /*
          分隔字符串返回varchar 数组
        */
        FUNCTION FUN_STR_SPLIT(STR IN VARCHAR2,SPLIT_STR VARCHAR2) RETURN VARCHAR2 IS 
            V_STR       VARCHAR2(1000);                     --源字符串
            N_COUNT     NUMBER:=0;                          --计数器(用做数组的下标)
            LIS_STR     T_VARCHAR_TABLE:=T_VARCHAR_TABLE(); --使用逗号分隔的字符串数组
            N_INSTR     NUMBER;                             --逗号所在的下标位置
            V_SPLIT_STR VARCHAR2(100);                      --使用逗号截取后的字符串
            V_RESULT  VARCHAR2(2000) ;
        BEGIN
            V_STR:=STR;
            LOOP
                EXIT WHEN V_STR IS NULL;
                BEGIN
                    N_INSTR:=INSTR(V_STR,SPLIT_STR);
                    V_SPLIT_STR:='';
                    IF N_INSTR=0 THEN          --如果N_INSTR 逗号所在下标位置为0 表示为最后一个字符
                        V_SPLIT_STR:=TRIM(V_STR);    
                        V_STR:='';
                    ELSE 
                        V_SPLIT_STR:=TRIM(SUBSTR(V_STR,0,N_INSTR-1));
                        V_STR:=SUBSTR(V_STR,N_INSTR+LENGTH(SPLIT_STR));
                    END IF ;
                    IF LENGTH(V_SPLIT_STR)>0 THEN
                        N_COUNT:=N_COUNT+1;
                        LIS_STR.EXTEND;
                        LIS_STR(N_COUNT):=V_SPLIT_STR;
                    END IF;
                END ;
            END LOOP;
            FOR I IN LIS_STR.FIRST .. LIS_STR.LAST LOOP
                V_RESULT:=V_RESULT||CHR(39)||LIS_STR(I)||CHR(39)||',';
            END LOOP;
            IF V_RESULT IS NOT NULL THEN
              V_RESULT := SUBSTR(V_RESULT,1,LENGTH(V_RESULT)-1) ;
            END IF ;
            RETURN V_RESULT;
        END FUN_STR_SPLIT;
        
    END PK_DEX_PUB;
     
    SQL> SELECT PK_DEX_PUB.FUN_STR_SPLIT('FJSDLKFJSLD,FJKDLSJFL@FJDSKLMFL,JKFLDS','@') FROM DUAL ;
     
    PK_DEX_PUB.FUN_STR_SPLIT('FJSD
    --------------------------------------------------------------------------------
    'FJSDLKFJSLD,FJKDLSJFL','FJDSKLMFL,JKFLDS'你试试。
      

  9.   

    用instr也可以实现select * from table where  INSERT(joblist,  '''' || 姓名 || '''') > 0