create or replace procedure sp_20111024_master_procedure
(  v_column_name in varchar2,
   v_column_type in varchar2,
   begin_time in date,
   end_time in date,
   serch_date in date,
   tmep_tablename1 in varchar2,
   v_num in number,
   return_chage out number,
   return_num out number
) is
    v_table varchar2(16);
    sqlstr varchar2(4096);
    v_cursor sys_refcursor;
    v_type gsmdata%rowtype;
    erre_reciev number;    
begin
    --调用存储过程,使用返回的表及游标,以便下面使用。
    sp_20111024_time_slot(begin_time,end_time,tmep_tablename1,erre_reciev,v_table);
    sqlstr:='create table  tb_20111026_master (imsi varchar2(16),
                                        imei varchar2(16),
                                        tme date,
                                        ip varchar2(8),
                                        location varchar2(64),
                                        sequence number(10)
                                        )';
    execute immediate sqlstr;
    --循环查询两个表中相同的数据,存入结果表。
    sqlstr:='select * from '||v_table||'';
    execute immediate sqlstr;
    open v_cursor for sqlstr;
    
     loop
       fetch v_cursor into v_type;
    exit when v_cursor%notfound;
      sqlstr:=' insert into tb_20111026_master
      (imsi,imei,tme,ip,location,sequence)
      select * from '||v_table||'             
      where '''||v_column_name||'''='''||v_column_type||''' and '''||v_type.tme||''' >= '''||serch_date||''' - '''||v_num||'''/(24*60*60) and '''||v_type.tme||''' <= '''||serch_date||''' + '''||v_num||'''/(24*60*60)';
      execute immediate sqlstr;    --时间是日期型 结果却是数值型
     
   end loop;
   
    commit;
      --将结果作为表返回。
      --result_table:=tb_20111025_master;
   exception 
     when others then
       return_num:=1;
       return_chage:=erre_reciev;
       dbms_output.put_line('主程序出现错误,请核对!!'||','||sqlcode||','||sqlerrm);
end sp_20111024_master_procedure;结果提示无效数字,我确定是在中间sqlstr上出错  在>= <=上出错 但就是不知哪错了 请支招 谢谢!!

解决方案 »

  1.   

    where '''||v_column_name||'''='''||v_column_type||''' and '''||v_type.tme||''' >= '''||serch_date||''' - '''||v_num||'''/(24*60*60) and '''||v_type.tme||''' <= '''||serch_date||''' + '''||v_num||'''/(24*60*60)';
    你不觉得你 引号多了吗?
    不需要用单引号的地方你用了
      

  2.   

    把sqlstr值打印出来看一下,这样容易找错!
      

  3.   

     sqlstr:=' insert into tb_20111026_master
      (imsi,imei,tme,ip,location,sequence)
      select * from '||v_table||'   
      where '''||v_column_name||'''='''||v_column_type||''' and '''||v_type.tme||''' >= '''||serch_date||''' - '''||v_num||'''/(24*60*60) and '''||v_type.tme||''' <= '''||serch_date||''' + '''||v_num||'''/(24*60*60)';
      execute immediate sqlstr; 我知道这个地方错了  但怎么改啊  没找到合适的方法  请高手支招 !!!!!!!!!!
      

  4.   


    我又改了一下,如下 代码
    sqlstr:=' insert into tb_20111026_master
          (imsi,imei,tme,ip,location,sequence)
          select * from '||v_table||'
          where '||v_column_name||' = '||v_column_type||' 
          and '||v_type.tme||' >= to_date('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') - 60/(24*60) 
          and '||v_type.tme||' <= to_date('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') + 60/(24*60)';
         dbms_output.put_line(sqlstr);
          execute immediate sqlstr;提示: insert into tb_20111026_master
          (imsi,imei,tme,ip,location,sequence)
          select * from c
          where imsi = 460007607836627 
          and 23-8月 -11 >= to_date('24-8月 -11','yyyy-mm-dd hh24:mi:ss') - 60/(24*60) 
          and 23-8月 -11 <= to_date('24-8月 -11','yyyy-mm-dd hh24:mi:ss') + 60/(24*60)
    主程序出现错误,请核对!!,-920,ORA-00920: 无效的关系运算符
      

  5.   

    把 23-8月 -11  转成日期to_date('24-8月-11','dd-mon-yy') 
      

  6.   


    insert into tb_20111026_master
          (imsi,imei,tme,ip,location,sequence)
          select * from c
          where imsi = 460007607836627 
          and 23-8月 -11 >= to_date('24-8月 -11','dd-mon-yy hh24:mi:ss') - 60/(24*60) 
          and 23-8月 -11 <= to_date('24-8月 -11','dd-mon-yy hh24:mi:ss') + 60/(24*60)
    主程序出现错误,请核对!!,-920,ORA-00920: 无效的关系运算符
      

  7.   

    前面的23-8月-11  也转成日期比较
    and to_date('23-8月 -11','dd-mon-yy') >= 
    and to_date('23-8月 -11','dd-mon-yy') <= 。。
      

  8.   

    即使不用转, 你也应该用打上引号吧。不转的话 这个日期字符串 不能隐式的转成与日期, 无法与日期进行比较的。
    你可以用select 语句测试下:
    select '23-8月 -11' - to_date('24-8月 -11','dd-mon-yy hh24:mi:ss')
    from dual;
    看能不能通过编译。
      

  9.   

    sqlstr:=' insert into tb_20111026_master
      (imsi,imei,tme,ip,location,sequence)
      select * from '||v_table||'
      where '||v_column_name||' = '||v_column_type||'  
      and '||to_char(v_type.tme,'yyyy-mm-dd hh24:mi:ss')||' >= to_char('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') - 60/(24*60)  
      and '||to_char(v_type.tme,'yyyy-mm-dd hh24:mi:ss')'||' <= to_char('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') + 60/(24*60)';
      dbms_output.put_line(sqlstr);
      execute immediate sqlstr;
      

  10.   

    --我上面的错了,没有看到你后面还有时间运算,改成下面的
    sqlstr:=' insert into tb_20111026_master
      (imsi,imei,tme,ip,location,sequence)
      select * from '||v_table||'
      where '||v_column_name||' = '||v_column_type||'   
      and '||to_char(v_type.tme,'yyyy-mm-dd hh24:mi:ss')||' >= to_char(to_date('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') - 60/(24*60),''yyyy-mm-dd hh24:mi:ss'')   
      and '||to_char(v_type.tme,'yyyy-mm-dd hh24:mi:ss')'||' <= to_char(to_date('''||serch_date||''',''yyyy-mm-dd hh24:mi:ss'') + 60/(24*60),''yyyy-mm-dd hh24:mi:ss'')';
      dbms_output.put_line(sqlstr);
      execute immediate sqlstr;
      

  11.   

    --sql最终的结果是这样的
    insert into tb_20111026_master
      (imsi,imei,tme,ip,location,sequence)
      select * from c
      where imsi = 460007607836627  
      and '2011-08-23'>=to_char(to_date('24-8月 -11','dd-mon-yy hh24:mi:ss') - 60/(24*60),'yyyy-mm-dd hh24:mi:ss')  
      and '2011-08-23'<= to_char(to_date('24-8月 -11','dd-mon-yy hh24:mi:ss') + 60/(24*60),'yyyy-mm-dd hh24:mi:ss') 
      

  12.   

    begin_time in date,
    end_time in date,
    serch_date in date,存储过程的参数都是 date 类型的,你还 to_date 干嘛?