请选择 进入手机版 | 继续访问电脑版

ORACLE SOS

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2544|回复: 0

long转换为varchar2脚本

[复制链接]

95

主题

266

帖子

1705

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1705
发表于 2018-7-12 12:17:03 | 显示全部楼层 |阅读模式
  1. create or replace package long_help authid current_user as
  2.   function substr_of(p_query in varchar2,
  3.                      p_from  in number,
  4.                      p_for   in number,
  5.                      p_name1 in varchar2 default NULL,
  6.                      p_bind1 in varchar2 default NULL,
  7.                      p_name2 in varchar2 default NULL,
  8.                      p_bind2 in varchar2 default NULL,
  9.                      p_name3 in varchar2 default NULL,
  10.                      p_bind3 in varchar2 default NULL,
  11.                      p_name4 in varchar2 default NULL,
  12.                      p_bind4 in varchar2 default NULL) return varchar2;
  13. end;
  14. /
  15. create or replace package body long_help as
  16. g_cursor number := dbms_sql.open_cursor; g_query varchar2(32765); procedure bind_variable(p_name in varchar2, p_value in varchar2) is
  17. begin
  18. if (p_name is
  19. not null) then dbms_sql.bind_variable(g_cursor, p_name, p_value);
  20. end if;
  21. end; function substr_of(p_query in varchar2, p_from in number, p_for in number, p_name1 in varchar2 default NULL, p_bind1 in varchar2 default NULL, p_name2 in varchar2 default NULL, p_bind2 in varchar2 default NULL, p_name3 in varchar2 default NULL, p_bind3 in varchar2 default NULL, p_name4 in varchar2 default NULL, p_bind4 in varchar2 default NULL) return varchar2 as
  22. l_buffer varchar2(4000); l_buffer_len number;
  23. begin
  24. if (nvl(p_from, 0) <= 0) then raise_application_error(-20002, 'From must be >= 1 (positive numbers)');
  25. end if; if (nvl(p_for, 0) not between 1 and 4000) then raise_application_error(-20003, 'For must be between 1 and 4000');
  26. end if; if (p_query <> g_query or g_query is
  27. NULL) then if (upper(trim(nvl(p_query, 'x'))) not like 'SELECT%') then raise_application_error(-20001, 'This must be a select only');
  28. end if; dbms_sql.parse(g_cursor, p_query, dbms_sql.native); g_query := p_query;
  29. end if; bind_variable(p_name1, p_bind1); bind_variable(p_name2, p_bind2); bind_variable(p_name3, p_bind3); bind_variable(p_name4, p_bind4); dbms_sql.define_column_long(g_cursor, 1); if (dbms_sql.execute_and_fetch(g_cursor) > 0) then dbms_sql.column_value_long(g_cursor, 1, p_for, p_from - 1, l_buffer, l_buffer_len);
  30. end if; return l_buffer;
  31. end substr_of;
  32. end;
  33. /

  34. select table_owner,table_name,max(high_value) from (
  35. SELECT *
  36.   FROM (SELECT TABLE_OWNER,
  37.                 TABLE_NAME,
  38.                 PARTITION_NAME,
  39.                 LONG_HELP.SUBSTR_OF('SELECT HIGH_VALUE
  40. FROM   DBA_TAB_PARTITIONS WHERE TABLE_OWNER=:TABLE_OWNER
  41. AND TABLE_NAME=:TABLE_NAME
  42. AND PARTITION_NAME=:PARTITION_NAME',
  43.                                      1,
  44.                                      4000,
  45.                                      'TABLE_OWNER',
  46.                                      TABLE_OWNER,
  47.                                      'TABLE_NAME',
  48.                                      TABLE_NAME,
  49.                                      'PARTITION_NAME',
  50.                                      PARTITION_NAME) HIGH_VALUE
  51.            FROM DBA_TAB_PARTITIONS))
  52.            group by table_owner,table_name;
复制代码



Q Q:107644445
Tel:13429648788
Email:dba@xifenfei.com
个人Blog(惜分飞)
提供专业ORACLE技术支持(数据恢复,安装实施,升级迁移,备份容灾,故障诊断,系统优化等)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|ORACLE SOS 技术论坛

GMT+8, 2023-2-2 16:51 , Processed in 0.017012 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表