暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将数据写入clob

ASKTOM 2019-04-29
540

问题描述

嗨,汤姆,如何将表数据写入oracle 12.1版本中的另一个表中的clob列

create table abc(sno number(2) not null,file_clob clob);

insert into abc(sno) values(1);
insert into abc(sno) values(2);
insert into abc(sno) values(3);

create table rem(sno number(2), name varchar2(10),address varchar2(10));
insert into rem (sno,name,address) values (1,'anc','err');
insert into rem (sno,name,address)values(2,'sjd','djjd');
insert into rem (sno,name,address) values(2,'sjd','sdjd');
insert into rem (sno,name,address)values (2,'kfkf','kkkd');


create or replace TYPE type_sno FORCE AS OBJECT
( 
 sno number(2 )
);
/

create or replace TYPE type_sno_values  FORCE AS TABLE OF type_sno;
/

create or replace procedure insert_to_clob(pi_sno IN type_sno_values)
as

 cright  clob;
 cright1   clob;
 header   varchar2(1000):='ancsjsjjsjsjjssjsjjssjsjsjjs';
cursor input_sno is select osd.sno from table(pi_sno) osd;
 begin
 for task in input_sno loop 
 UPDATE abc
            SET file_clob  = empty_clob()
            WHERE sno = task.sno
            RETURNING file_clob  
         INTO cright;
        dbms_lob.writeappend(cright,length(header),header);
   cright1:=cright;
  cright1:=empty_clob();
FOR i IN ( SELECT CHR(10)
                || sno  || ';'
                || name  || ';'
                || address str
            FROM
                rem
            WHERE
                sno = task.sno) loop
 cright1:=cright1||i.str;
-- dbms_output.put_line(v_cwrite1);
 if(length(cright1)>=32000 or i.str.last )  then 
dbms_lob.writeappend(cright,length(cright1),cright1);
   end if;
 end loop;

 end loop;
 EXCEPTION
    WHEN OTHERS THEN
        RAISE;
end;


我上面的程序没有给出预期的输出,abc clob中的预期输出如下。

对于sno 1的abc表colb (FILE_CLOB) 列。

ancsjsjjsjsjjssjsjjssjsjsjjs
anc; 错误

对于abc表colb (FILE_CLOB) 列为sno 2。

ancsjsjjsjsjjssjsjjssjsjsjjs
sjd;djjd
sjd;djjd
sjd;sdjd

当cright1> = 32000或i.str last时,数据应更新为abc表 (FILE_CLOB) 列。

1) 我无法为上述条件编写代码。
2) 我没有得到程序上方的预期输出形式。
3) 在性能方面是否有任何好的方法。

专家解答

我对你想在这里做什么有点困惑。但是,如果要将值追加到CLOB列,则只需将更新返回变量追加到变量即可。

不需要长度检查或中间值。

例如:

create or replace procedure insert_to_clob (
  pi_sno in type_sno_values
) as

  cright    clob;
  header    varchar2 (1000) := 'ancsjsjjsjsjjssjsjjssjsjsjjs';
  cursor input_sno is
  select osd.sno
  from   table (pi_sno) osd;

begin 
  for task in input_sno loop
    update abc
    set   file_clob = empty_clob ()
    where sno = task.sno 
    returning file_clob into cright;
  
    dbms_lob.writeappend (cright,length (header),header);

    for i in ( 
      select chr (10) || name || ';' || address as str 
      from rem
      where sno = task.sno
    ) loop
    
      dbms_lob.writeappend (cright,length (i.str),i.str);

    end loop;
  end loop;
end;
/

select * from abc;

SNO   FILE_CLOB   
     1        
     2        
     3   

begin
  insert_to_clob (
    type_sno_values ( type_sno ( 1 ) )
  );
  
  insert_to_clob (
    type_sno_values ( type_sno ( 2 ) )
  );
end;
/

select * from abc;

SNO   FILE_CLOB                                                  
     1 ancsjsjjsjsjjssjsjjssjsjsjjs
anc;err                        
     2 ancsjsjjsjsjjssjsjjssjsjsjjs
sjd;djjd
sjd;sdjd
kfkf;kkkd    
     3   

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论