在做一个数据字典时--数据字典表
CREATE TABLE ZDBA01A(
ZDBA01A010        VARCHAR(10)                  NOT NULL,    --FIELD_CODE,字段代码
ZDBA01A020        VARCHAR(100),                             --FIELD_CHIN,汉字名
ZDBA01A030        VARCHAR(30),                              --FIELD_NAME,数据项名
ZDBA01A040        VARCHAR(10),                              --FIELD_TYPE,类型
ZDBA01A050        NUMBER(4,0),                              --FIELD_LEN, 长度
ZDBA01A060        NUMBER(2,0),                              --FIELD_DEC,小数位
ZDBA01A070        VARCHAR(20),                              --U_NAME,单位
ZDBA01A080        VARCHAR(50),                              --FIELD_DEFA,缺省值
ZDBA01A090        VARCHAR(1),                               --FIELD_NULL,空值  字段值是否允许为空值
ZDBA01A100        VARCHAR(200),                             --FIELD_CAPT,字段说明  
PRIMARY KEY(ZDBA01A010)
);--对字典表进行批量插入时
-- a.data_default 值为long型,无法转换为varchar2类型
insert into ZDBA01A
        (ZDBA01A010,
         ZDBA01A040,
         ZDBA01A050,
         ZDBA01A060,
         ZDBA01A080,
         ZDBA01A090,
         ZDBA01A100)
        (select a.column_name,
                a.data_type,
                a.data_length,
                a.data_scale,
                null, --a.data_default
                a.nullable,
                b.comments
           from user_tab_cols a, user_col_comments b
          where a.table_name = b.table_name
            and a.column_name = b.column_name
            and a.table_name = tableName);我知道可以用 declare
userStr varchar2(50);select utc.data_default
      into userStr
      from user_tab_cols utc
     --表名
     where utc.table_name = TABLENAME
     --字段名
     and utc.column_name = COLUMNNAME;
然后再 substr 将 userStr insert into 到 字典表 里面,这样只能一条一条的查询,转换再插入,可是我是批量插入!求批量插入时进行long ->varchar2转换的解决方法。

解决方案 »

  1.   

    注: user_tab_cols  为系统视图,在sys.col$里面,它的default#是用long型,所以我只能按照Oracle定义的类型来读取,郁闷....
      

  2.   

    declare
    userStr varchar2(50);select utc.data_default
          into userStr
          from user_tab_cols utc
         --表名
         where utc.table_name = TABLENAME
         --字段名
         and utc.column_name = COLUMNNAME;你将这代码写成一个FUNCTION,,批量插入的时候,调用这个FUNCTION试试呢ORACLE里 LONG型和其它类型好象不能直接互转的
      

  3.   

    谢谢楼上的朋友提醒,我直接自己写了个小函数create or replace function long_to_varchar(tableName  varchar,
                                               columnName varchar)
      return varchar as  returnValue varchar2(50);begin
      select utc.data_default
        into returnValue
        from user_tab_cols utc
       where utc.table_name = tableName
         and utc.column_name = columnName;
      return returnValue;
    end long_to_varchar;