解决方案 »

  1.   

    不一样的,表A中有个varchar2字段,我要把它转为blob字段再插入到表B的另一个字段中
      

  2.   

    如果B原来就是空表,不是某张大表经过delete变成的那种空表。加个append提示来进行insert
     insert /*+append*/ into B select ......... from A
      

  3.   

    delete与否有什么区别啊?因为之前是有一些数据的,删过了,这样的话需要drop掉这张表重建吗?
    还有我看到网上说append配合nologging一起使用比较好,alter table nologging之后插入数据,再执行altere table logging,这样可以吗?有没有什么影响
      

  4.   

    可以这么做。但是用了no_logging,不产生redo时,如果用了数据库同步工具,可能会对同步造成影响
    对备份恢复也会造成影响如果先前delete过,且原来的数据量较大,在用append前,先将空表做个truncate操作降低水位即可,不用重建
      

  5.   

    这样子啊,谢了啊。还有一个问题想请教下。
    A表有detail varchar2字段,B表有detail blob字段,A表的detail列数据里有换行。我直接用insert into B selete V2B(detail) from A,这样B表中的detail列的显示的数据和A表的的detail列一致。但是如果用触发器,即A表插入一条数据后触发添加数据到B表,可是B表得到的数据是没有换行的,这是为什么呢?
    可能表述的不太清楚,比如说插入A表数据为



    ,然后触发器起作用,B表得到的数据是
    我爱你。
    数据没有换行,这是为什么啊,有什么办法使得数据一致呢?
    下面是varchar2转blob的函数/*---CLOB转换为BLOB---*/
    FUNCTION C2B(v_clob IN CLOB DEFAULT EMPTY_CLOB()) RETURN BLOB
    AS
      res         BLOB;
      b_len       NUMBER := dbms_lob.getlength(v_clob);
      dest_offset NUMBER := 1;
      src_offset  NUMBER := 1;
      amount_c    INTEGER := DBMS_LOB.lobmaxsize;
      blob_csid   NUMBER := DBMS_LOB.default_csid;
      lang_ctx    INTEGER := DBMS_LOB.default_lang_ctx;
      warning     INTEGER;
    BEGIN
      IF b_len>0 THEN
        DBMS_LOB.createtemporary(res,true);
        DBMS_LOB.open(res,DBMS_LOB.lob_readwrite);
        DBMS_LOB.convertToBlob(res,v_clob,amount_c,dest_offset,src_offset,blob_csid,lang_ctx,warning);
      ELSE
        SELECT EMPTY_BLOB() INTO res FROM DUAL;
      END IF;
      RETURN res;
    END;FUNCTION V2B(v_str IN VARCHAR2) RETURN BLOB
    AS
      V_CLOB CLOB;
      V_BLOB BLOB;
    BEGIN
      IF LENGTH(v_str)>0 THEN
        SELECT TO_CLOB(v_str) INTO V_CLOB FROM DUAL;
        SELECT C2B(V_CLOB) INTO V_BLOB FROM DUAL;
      ELSE
        SELECT EMPTY_BLOB() INTO V_BLOB FROM DUAL;
      END IF;
      RETURN V_BLOB;
    END;