关于long类型的转换

在oracle中对于long类型的处理时很纠结的。最开始引入这个数据类型的时候是对原有数据类型的补充,但是后面发现还是碰到了一些问题,使用Lob类型代替了。但是long类型从兼容性上来说还得支持,而且从数据库的数据字典中还是能够看到Long类型的影子。
比如我们想查看一个表中某个列的默认值情况,可以查询user_tab_cols,或者dba_tab_cols等,字段data_default是Long类型。
SQL> desc user_tab_cols
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 COLUMN_NAME                               NOT NULL VARCHAR2(30)
 DATA_TYPE                                          VARCHAR2(106)
 DATA_TYPE_MOD                                      VARCHAR2(3)
 DATA_TYPE_OWNER                                    VARCHAR2(120)
 DATA_LENGTH                               NOT NULL NUMBER
 DATA_PRECISION                                     NUMBER
 DATA_SCALE                                         NUMBER
 NULLABLE                                           VARCHAR2(1)
 COLUMN_ID                                          NUMBER
 DEFAULT_LENGTH                                     NUMBER
 DATA_DEFAULT                                       LONG
 NUM_DISTINCT                                       NUMBER
 LOW_VALUE                                          RAW(32)
 HIGH_VALUE                                         RAW(32)
 DENSITY                                            NUMBER
 NUM_NULLS                                          NUMBER
 NUM_BUCKETS                                        NUMBER
 LAST_ANALYZED                                      DATE
 SAMPLE_SIZE                                        NUMBER
 CHARACTER_SET_NAME                                 VARCHAR2(44)
 CHAR_COL_DECL_LENGTH                               NUMBER
 GLOBAL_STATS                                       VARCHAR2(3)
 USER_STATS                                         VARCHAR2(3)
 AVG_COL_LEN                                        NUMBER
 CHAR_LENGTH                                        NUMBER
 CHAR_USED                                          VARCHAR2(1)
 V80_FMT_IMAGE                                      VARCHAR2(3)
 DATA_UPGRADED                                      VARCHAR2(3)
 HIDDEN_COLUMN                                      VARCHAR2(3)
 VIRTUAL_COLUMN                                     VARCHAR2(3)
 SEGMENT_COLUMN_ID                                  NUMBER
 INTERNAL_COLUMN_ID                        NOT NULL NUMBER
 HISTOGRAM                                          VARCHAR2(15)
 QUALIFIED_COL_NAME                                 VARCHAR2(4000)

如果想使用Like来模糊匹配或者重新创建一个临时表,都会碰到Long类型的问题。

select *from user_tab_cols where data_default like 'a%'
                                 *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG

SQL> create table t1 as select *from user_tab_cols;
create table t1 as select *from user_tab_cols
                          *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype 
既然不支持,Oracle也提供了对应的一些方法来满足我们的需要。
在thomas kyte的书中,对这种实现方法做了详细的解释。
使用的代码如下,基本就是把Long类型转换为varchar2,按照每批4000个字节的容量进行转换。
create or replace package long_help authid current_user as 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;
end;
/
create or replace package body long_help as
  g_cursor number := dbms_sql.open_cursor;
  g_query  varchar2(32765);
  procedure bind_variable(p_name in varchar2, p_value in varchar2) is
  begin
  if (p_name is not null) then dbms_sql.bind_variable(g_cursor, p_name, p_value);
  end if;
   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
l_buffer varchar2(4000); l_buffer_len number;
begin
if (nvl(p_from, 0) = 1 (positive numbers)');
end if;
if (nvl(p_for, 0) not between 1 and 4000) then raise_application_error(-20003, 'For must be between 1 and 4000');
end if;
if (p_query g_query or g_query is
NULL) then if (upper(trim(nvl(p_query, 'x'))) not like 'SELECT%') then raise_application_error(-20001, 'This must be a select only');
end if;
dbms_sql.parse(g_cursor, p_query, dbms_sql.native); g_query := p_query;
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);
end if;
return l_buffer;
end substr_of;
end;
/

这个时候我们想查询data_default的值就可以使用如下的sql
SELECT *
  FROM (SELECT OWNER,
               TABLE_NAME,
               COLUMN_NAME,
               DATA_TYPE,
               LONG_HELP.SUBSTR_OF('SELECT data_default FROM   DBA_TAB_COLS WHERE OWNER=:OWNER  AND TABLE_NAME=:TABLE_NAME AND COLUMN_NAME=:COLUMN_NAME',
                                   1,
                                   4000,
                                   'OWNER',
                                   OWNER,
                                   'TABLE_NAME',
                                   TABLE_NAME,
                                   'COLUMN_NAME',
                                   COLUMN_NAME) DATA_DEFAULT
          FROM DBA_TAB_COLS);

查询结果如下:
OWNER                TABLE_NAME                     COLUMN_NAME                    DATA_TYPE                      DATA_DEFAULT
-------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------
SYS                  RECO_SCRIPT_BLOCK$             CTIME                          DATE                           SYSDATE
SYS                  RECO_SCRIPT_BLOCK$             SPARE1                         NUMBER
SYS                  RECO_SCRIPT_BLOCK$             SPARE2                         NUMBER
SYS                  RECO_SCRIPT_BLOCK$             SPARE3                         NUMBER
SYS                  RECO_SCRIPT_BLOCK$             SPARE4                         VARCHAR2
SYS                  RECO_SCRIPT_BLOCK$             SPARE5                         VARCHAR2
SYS                  RECO_SCRIPT_BLOCK$             SPARE6                         DATE
SYS                  STREAMS$_COMPONENT_LINK        SOURCE_COMPONENT_ID            NUMBER
SYS                  STREAMS$_COMPONENT_LINK        DEST_COMPONENT_ID              NUMBER
SYS                  STREAMS$_COMPONENT_LINK        PATH_ID                        NUMBER
SYS                  STREAMS$_COMPONENT_LINK        POSITION                       NUMBER

时间: 2024-11-08 20:58:59

关于long类型的转换的相关文章

C# char类型字符转换大小写的实现代码

以下是对C#中char类型字符转换大小写的示例代码进行了介绍,需要的朋友可以过来参考下哦   C# char类型有自带的大小写转换方法:ToUpper和ToLowerchar str1 = 'a'; char str2 = 'A'; Char.ToUpper(str1); Char.ToLower(str2);

sql 语句中字符类型的转换问题,在线等!!!急!!!

问题描述 sql 语句中字符类型的转换问题,在线等!!!急!!! select 'http//'+ID+'.html' as LINK from A ID的字符类型是bigint的,出现错误提示:"从数据类型 varchar 转换为 bigint 时出错."求解决语法!!! 解决方案 select 'http//'+convert(varchar(20)ID)+'.html' as LINK from A 解决方案二: select 'http//'+cast t(ID as varc

java虚拟机在进行类型强制转换的时候究竟做了什么

问题描述 java虚拟机在进行类型强制转换的时候究竟做了什么 打个比方 A a = new A(): B b = (B)a: 这两行代码究竟是怎样在Jvm中实现的? 解决方案 子类继承父类之后,在new子类的时候,实际上父类也被构造出来了,因此子类实际上包含着父类的完整信息,也就因此可以完成向上转型,. 至于具体怎么实现的,我查了一下好像是堆分配的过程,贴两个链接,不误导了.http://blog.csdn.net/anjayxc/article/details/6063210http://ww

jsp-JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码

问题描述 JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码 JSP传给action的是字符串类型,怎么转换数据类型,然后让getlist()接收,求各位大神帮帮忙写下代码~ 如果能够给解释一下,那就千恩万谢啦 解决方案 可以通过强制转换在前面加上int 解决方案二: gongWenLeiBieList = dao.getList(Integer.parseInt(mingCheng));

类型之间转换 安卓 集合

问题描述 类型之间转换 安卓 集合 登陆文件 //获取布局文件的组件 EditText editText=(EditText) findViewById(R.id.person); EditText editText2=(EditText) findViewById(R.id.pwd); //获取用户输入的值 String user=editText.getText().toString(); String pwd=editText2.getText().toString(); SqlServi

java 日期类型转换-JAVA 日期类型内部转换

问题描述 JAVA 日期类型内部转换 如何将 日期类型数据 "Fri Nov 15 12:01:32 CST 2013 "转换成 "2013-11-15 12:01:32"的日期类型数据? 代码如下: try { // 将已有的时间字符串转化为Date对象 Date date; // 首先设置"Fri Nov 15 12:01:32 CST 2013"的格式,用来将其转化为Date对象 DateFormat df = new SimpleDate

类中的内存分配和指针类型强制转换问题

问题描述 类中的内存分配和指针类型强制转换问题 问题描述: template //element type class list { private: EleT data;//数据本身,即是需要的信息 list* prio;//the pointer of prior element list* next;//the pointer of next element list* last;//the last pointer of list int len;//the length of list

js中string和number类型互转换技巧(分享)_javascript技巧

1.string-->number string类型   *1  即可变成  number类型 2.number-->string number类型  +''  即可变成  string 类型 <script type="text/javascript"> function screenInfo() { var str = '012.8372'; var s = 0; str = str * 1; alert(typeof (str));//number s +

c++中string类型的iterator到size_t类型如何转换

问题描述 c++中string类型的iterator到size_t类型如何转换 如题,string类型提供很多如substr等函数是以size_t类型为参数的,但是使用迭代器又很方便,所以有没有什么办法可以在两者之间互相转换,或者方便的一起使用? 解决方案 这个不能,可以用JAVA,用PYTHON,用C ... 啦啦啦 解决方案二: 没办法,这个不能直接转换,类型不一样. 解决方案三: size_t类型size_t类型的用途size_t 是什么类型? 解决方案四: 直接转不可能的,可以设置一个i

指针-数组名进行类型强制转换的问题

问题描述 数组名进行类型强制转换的问题 int main(void) { int a[4] = {1, 2, 3, 4}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%x, %x/n", ptr1[-1], *ptr2); return 0; } 为什么ptr2指向a[0]的第二个字节? 个人理解是数组名a是指向a[0]的指针,强制转换为int型变量,再加1,就相当于将原来所存放a[0]的地址当作