当前位置: 代码迷 >> Oracle管理 >> 提示 无效数字 不解,该怎么处理
  详细解决方案

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

热度:785   发布时间:2016-04-24 05:29:12.0
提示 无效数字 不解
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上出错 在>= <=上出错 但就是不知哪错了 请支招 谢谢!!



------解决方案--------------------
'''||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;
看能不能通过编译。

------解决方案--------------------
  相关解决方案