ITPub博客

首页 > Linux操作系统 > Linux操作系统 > long类型数据的截取

long类型数据的截取

原创 Linux操作系统 作者:lnwxzyp 时间:2009-04-03 01:12:16 0 删除 编辑
最近做了一个按日期进行分区的分区表,根据数据字典的值进行相应操作的 存储过程,需要对user_tab_partitions 的high_value字段进行截取 去其中的日期值 并转换成date型 然后进行一些条件的判断。
long的值:TO_DATE(' 2009-04-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
我需要从中截取 2009-04-04 并转换成 日期型数据来进行判断

SQL> declare n varchar2(30);
  2  begin
  3  select substr(high_value,11,10) into n from user_tab_partitions where table_name='ZYP_PT_DATE';
  4  dbms_output.put_line(n);
  5  end;
  6  /

declare n varchar2(30);
begin
select substr(high_value,11,10) into n from user_tab_partitions where table_name='ZYP_PT_DATE';
dbms_output.put_line(n);
end;

ORA-06550: 第 3 行, 第 15 列:
PL/SQL: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 LONG
ORA-06550: 第 3 行, 第 1 列:
PL/SQL: SQL Statement ignored
经过多次尝试 终于找到了解决方法 那就是先将long型的数据传递给字符型 再由字符型进行转换
SQL>
SQL> declare n varchar2(50);
  2  begin
  3  select high_value into n from user_tab_partitions where table_name='ZYP_PT_DATE';
  4  dbms_output.put_line(substr(n,11,10));
  5  end;
  6  /

declare n varchar2(50);
begin
select high_value into n from user_tab_partitions where table_name='ZYP_PT_DATE';
dbms_output.put_line(substr(n,11,10));
end;

ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 line 3
还是报错 不过已经没有大问题了
SQL> declare n varchar2(500);
  2  begin
  3  select high_value into n from user_tab_partitions where table_name='ZYP_PT_DATE';
  4  dbms_output.put_line(length(n));
  5  end;
  6  /

83

PL/SQL procedure successfully completed
脱机出来的长度 应该要达到83才行

SQL> declare n varchar2(83);
  2  begin
  3  select high_value into n from user_tab_partitions where table_name='ZYP_PT_DATE';
  4  dbms_output.put_line(substr(n,11,10));
  5  end;
  6  /

2009-04-04

PL/SQL procedure successfully completed

SQL>
完成测试, 达到预期目的 。

end

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12216142/viewspace-584457/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    129
  • 访问量
    676723