提示 无效数字 不解,该怎么处理

提示 无效数字不解create or replace procedure sp_20111024_master_procedure(v_column_name in varchar2

提示 无效数字 不解
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 (imsivarchar2(16),
  imeivarchar2(16),
  tmedate,
  ipvarchar2(8),
  locationvarchar2(64),
  sequencenumber(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上出错 在>= <=上出错 但就是不知哪错了 请支招 谢谢!!



[解决办法]
'''||v_num||'''
[解决办法]
v_num 去掉前后 ''
[解决办法]
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)';


你不觉得你 引号多了吗?
不需要用单引号的地方你用了


[解决办法]
把sqlstr值打印出来看一下,这样容易找错!
[解决办法]
把 23-8月 -11 转成日期

to_date('24-8月-11','dd-mon-yy')
[解决办法]
前面的23-8月-11 也转成日期比较


and to_date('23-8月 -11','dd-mon-yy') >= 。。。
and to_date('23-8月 -11','dd-mon-yy') <= 。。

[解决办法]
即使不用转, 你也应该用打上引号吧。

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

------解决方案--------------------


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;


[解决办法]
--我上面的错了,没有看到你后面还有时间运算,改成下面的
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;


[解决办法]
--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')
[解决办法]
begin_time in date,
end_time in date,
serch_date in date,

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

探讨

引用:
把 23-8月 -11 转成日期

to_date('24-8月-11','dd-mon-yy')


insert into tb_20111026_master
(imsi,imei,tme,ip,location,sequence)
select * from c
where imsi = 4600……