--运行存储过程。
declare 
opentime varchar2(200);
closetime varchar2(200);
idstring varchar2(200);
counts number;
begin
opentime:='2012-07-15 18:00:00';
closetime:='2012-07-16 6:00:00';
idstring:='2818,2819,2822,2823,2824';  --在此处报无效数字错误。因为数据库中id是number型。却传入了一个字符串
pro_count(opentime,closetime,idstring,counts);
dbms_output.put_line(counts);
end;--存储过程中用到idstring的地方。数据库中id为number类型的。

解决方案 »

  1.   

    数据库中用到这个idstring的地方是:
    cursor c is select * from lampalarm_his where lampid in (idstring) order by lampid;
      

  2.   

    把你想用到idstring:='2818,2819,2822,2823,2824'拼結到一個字符串中,然後去處理
    exec immediate '你的拼結字符串'
      

  3.   

    create or replace procedure pro_count(opentime in varchar2,closetime in varchar2 ,idstring in varchar2,counts out number)
    is
           cursor c is select * from lampalarm_his where lampid in (idstring) order by lampid;lampid是number型的。存储过程传入的参数该定义成什么类型???求解答。
      

  4.   

    给你个建议,查查动态sql吧 童鞋。
    解释一句:
    你写的这个sql等价于
    cursor c is 
    select * from lampalarm_his where lampid in ('2818,2819,2822,2823,2824') order by lampid;跟你最终的想法,相差十万八千里,想这么干的话用动态sql。
    cursor c is 
    select * from lampalarm_his where lampid in (2818,2819,2822,2823,2824) order by lampid;
      

  5.   


    就是存储过程里需要一个id的串。但是这个id在数据库内定义的是number。 那么这个传入的id串该定义为什么类型呢?定义为varchar2 报无效数字错误。
      

  6.   


    是的。你明白了我的意思。我先去查一下动态sql吧。
      

  7.   

    觉得你该处理这个字符串,
    1 新建个临时字符串
    2 把传来的字符串逐个比较,只要是0-1的数字就把它存在 上面字符串中. 这个可以用到正则.
    3 然后to_number转成数字
      

  8.   

    -- 帖个例子给你:create or replace FUNCTION fun_getemails(i_user_ids VARCHAR2, i_cdate VARCHAR2 DEFAULT TO_CHAR(SYSDATE,'D'))
    /***************************************************
      **     功能:根据输入的用户ID(S)及日期得到相应的用户邮箱(查询user_info表)
      **     备注:工作日与非工作日区分对待:如果是工作日(周一到周五),则得到相关用户ID的workday_email字段内容;
      **           如果是非工作日(周六、日)则得到相关用户ID的weekend_email字段的内容
      **     参数输入格式:'01636,00220' (表示获取用户ID为01636和00220的邮箱)
      **   创建者:luoyoumou
      ** 创建时间:2012.05.22
      ****************************************************/
    RETURN varchar2 RESULT_CACHE
    IS
      l_sql    VARCHAR2(1000);
      l_emails VARCHAR2(200);
      l_user_ids VARCHAR2(200);
    BEGIN
      l_user_ids := ''''||replace(i_user_ids,',',''',''')||'''';
      l_sql := 'SELECT LISTAGG(DECODE(:i_cdate,''1'',weekend_email,''7'',weekend_email,workday_email),'';'') WITHIN GROUP(ORDER BY userid) as emails FROM user_info ';
      l_sql := l_sql || 'WHERE u_status=1 ' || 'AND (userid in('||l_user_ids||')' || ' OR parent_userid in('||l_user_ids||'))';  EXECUTE IMMEDIATE l_sql INTO l_emails USING i_cdate;
      RETURN l_emails;
    EXCEPTION WHEN OTHERS
      THEN
      RETURN NULL;
    END;
      

  9.   

    考虑用数组 或者拆分传入的值拆分值cursor c is select * from lampalarm_his where lampid in 
            (
                 select replace(regexp_substr(idstring,'[^,]+',1,level),',',' ') 
                 from dual
                 connect by level<=length(idstring)-length(replace(idstring,',',''))+1
            ) order by lampid;
      

  10.   

    字符串动态变化,要用到可以直接执行的SQL语句中是不允许的 看看DBMS_SQL相关内容就好了