【问题标题】:How to insert CLOB more then 1 Mb (1kk characters) in Oracle by script如何通过脚本在 Oracle 中插入超过 1 Mb(1kk 个字符)的 CLOB
【发布时间】:2015-06-13 15:02:08
【问题描述】:

如何通过脚本在 Oracle 中插入超过 1 Mb(1kk 个字符)的 CLOB 例如。使用 pl slq,可能会附加一些少于 32767 字节(字符)的部分。 绕过问题:“PLS-00172: string literal too long”。

这是我的目标表:

CREATE TABLE qon (x clob); 

这是引发错误的代码:

DECLARE 
    l_clob clob := '32769 chars+ '; 
BEGIN 
    FOR i IN 1..2 
    LOOP 
        INSERT INTO qon (x) VALUES (empty_clob()) --Insert an "empty clob" (not insert null) 
        RETURNING x INTO l_clob; -- Now we can append content to clob (create a 400,000 bytes clob) 
        FOR j IN 1..3 LOOP 
            dbms_lob.append(l_clob, rpad ('',4000,'')); --dbms_lob.append(l_clob, 'string chunk to be inserted (maximum 4000 characters at a time)'); 
        END LOOP; 
     END LOOP; 
END;

抱歉,明天会更正。这个想法 - 以某种方式插入字符串超过 32767

我正在搜索的网址:

Oralce CLOB can't insert beyond 4000 character?

How to query a CLOB column in Oracle

http://www.oradev.com/dbms_lob.jsp

How to write oracle insert script with one field as CLOB? http://www.techonthenet.com/oracle/functions/rpad.php

How to insert/update larger size of data in the Oracle tables?

https://www.aquaclusters.com/app/home/project/public/aquadatastudio/issue/8179

https://community.oracle.com/thread/2545044

谢谢

【问题讨论】:

  • 他们为什么不帮忙?您似乎知道您需要附加 32KiB 块。字符串从哪里来?无论如何,在脚本中包含 1MiB 文字会有点笨拙。它可能来自一个单独的文件吗?
  • 我想在脚本中存储一个 1MiB 的文字。大约 50 个脚本,每个脚本在每个数据库中插入一个带有一个 clob 值的行。所有这些都是为了绕过通常的插入 clob 值,基于 ui。在上面的 url 情况下,我仍然收到关于字符串太长的警告,我对 pl sql 的经验很少。谢谢
  • 到目前为止,我还不清楚你在问什么。我可以建议您 edit 您的问题,以提供更多背景信息并向我们展示您的问题确切是什么/在哪里。
  • 在 (PL/)SQL 脚本中不能有超过 32KiB 的单个文字。您将不得不拥有数千个较短的文字,这将是创建和维护的痛苦。为什么你不能有一个包含值的文本文件并从中加载?如果你能把它放到服务器上。您可以使用 utl_file、外部表等。目前您的要求似乎没有意义。
  • 请通过编辑按钮将新信息(尤其是代码)放入问题中 - 而不是作为评论。您一次可以追加 32KiB,而不仅仅是 4KB,因为它是 Pl/SQL 上下文;但单个字符串文字不能超过 32KiB。您可以在服务器上的单独文本文件中存在 1MiB 的“字符串”吗?

标签: sql string oracle plsql insert


【解决方案1】:

您似乎了解问题所在,但我不确定您为什么在实施时遇到困难。

这是我的表格版本:

create table qon
   ( id number
     , txt clob
     , len number )
/

这是我的代码版本:

declare
    l_clob clob;
    --  4000 characters is the limit for RPAD in SQL 
    l_str  varchar2 (32767);
    n number;
begin
    l_str := rpad ('string chunk to be inserted (maximum 32767) characters at a time',32767,'+');
    dbms_lob.createtemporary (l_clob,true );
    << recordz >>
    for i in 1..2 loop 
        << appendz >>
        for j in 1..10 loop 
            dbms_lob.append (l_clob, l_str);
        end loop appendz; 
        insert into qon  
            values (i, l_clob, dbms_lob.getlength(l_clob))
            returning qon.len into n;
        dbms_output.put_line('#'||i||' length of clob = '||n);
     end loop recordz; 
     dbms_lob.freetemporary (l_clob);
end;
/

它的输出是:

 ...
 21* end;
#1 length of clob = 327670
#2 length of clob = 655340

PL/SQL procedure successfully completed.

SQL> 

【讨论】:

    【解决方案2】:

    我认为这段代码可以帮助将大文本插入到 BLOB(CLOB) 列中

    SQL> drop table demo;
    Table dropped.
    
    SQL> drop sequence blob_seq;
    Sequence dropped.
    
    SQL> create table demo
      2  ( id           int primary key,
      3    theBlob      blob
      4  )
      5  /
    Table created.
    
    SQL> create or replace directory my_files as 'C:\hs';
    Directory created.
    
    SQL> create sequence blob_seq;
    Sequence created.
    
    SQL> create or replace
      2  procedure dbst_load_a_file( p_dir_name in varchar2,p_file_name in varchar2 )
      3  as
      4      l_blob    blob;
      5      l_bfile   bfile;
      6  begin
      7      insert into demo values ( blob_seq.nextval, empty_blob() )returning theBlob into l_Blob;
      8      l_bfile := bfilename( p_dir_name, p_file_name );
      9      dbms_lob.fileopen( l_bfile );
     10      dbms_lob.loadfromfile( l_blob, l_bfile,dbms_lob.getlength( l_bfile ) );
     11      dbms_lob.fileclose( l_bfile );
     12  end;
     13  /
    Procedure created.
    
    SQL> exec dbst_load_a_file( 'MY_FILES', 'my.jpg' );
    PL/SQL procedure successfully completed.
    
    SQL> select dbms_lob.getlength(theblob) from demo;
    DBMS_LOB.GETLENGTH(THEBLOB)
    ---------------------------
                        1964427
    

    【讨论】:

      【解决方案3】:

      在调试工作版本以使用 UTF-8 编码操作 CLOB 值后:

      drop table demo;
      drop sequence clob_seq;
      
      create table demo
      ( id           int primary key,
        theclob      clob
      )
      /
      
      create or replace directory MY_FILES as 'C:\hs';
      create sequence clob_seq;
      
      create or replace
      procedure dbst_load_a_file( p_dir_name in varchar2,p_file_name in varchar2 )
          as
              l_clob    clob;
              l_bfile   bfile;
              dst_offset  number := 1 ;
              src_offset  number := 1 ;
              lang_ctx    number := DBMS_LOB.DEFAULT_LANG_CTX;
              warning     number;
          begin
              insert into demo values ( clob_seq.nextval, empty_clob() )returning theclob into l_clob;
              l_bfile := bfilename( p_dir_name, p_file_name );
              dbms_lob.fileopen( l_bfile );
              dbms_lob.createtemporary(l_clob, true); -- attention: needed
              dbms_lob.loadclobfromfile( 
                DEST_LOB     => l_clob
              , SRC_BFILE    => l_bfile
              , AMOUNT       => dbms_lob.getlength( l_bfile )
              , DEST_OFFSET  => dst_offset
              , SRC_OFFSET   => src_offset
              , BFILE_CSID   => DBMS_LOB.DEFAULT_CSID
              , LANG_CONTEXT => lang_ctx
              , WARNING      => warning);
              dbms_lob.fileclose( l_bfile );
          end;
      
      exec dbst_load_a_file( 'MY_FILES', 'myBigText.txt' );
      

      【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2012-07-24
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多