2015-11-13 16 views
1

我有一个.Net应用程序连接oracle数据库,并希望输入超过4000个字符到数据库中的列。输入大量的内容到oracle数据库

我试着用CLOB仍然得到

输入字符串太长。

我正在使用SQL查询输入任何帮助的数据。

回答

2

最简单的方法是使用绑定变量。下面是简单的例子:

CREATE TABLE clob_table (val CLOB); 

void Main() 
{ 
    using (var connection = new OracleConnection("DATA SOURCE=hq_pdb_tcp;PASSWORD=oracle;USER ID=HUSQVIK")) 
    { 
     using (var transaction = new TransactionScope()) 
     { 
      connection.Open(); 

      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = "INSERT INTO clob_table (val) VALUES (EMPTY_CLOB()) RETURNING val INTO :clob"; 
       var parameter = command.Parameters.Add("clob", OracleDbType.Clob, ParameterDirection.Output); 

       command.ExecuteNonQuery(); 

       var clob = (OracleClob)parameter.Value; 

       ChunkFile(@"LargeTextFile.txt", 8060, (b, l) => clob.Append(b, 0, l)); 
      } 

      transaction.Complete(); 
     } 
    } 
} 

private void ChunkFile(string fileName, int chunkSize, Action<char[], int> chunkAction) 
{ 
    using (var stream = File.OpenText(fileName)) 
    { 
     do 
     { 
      var buffer = new char[chunkSize]; 
      var length = stream.Read(buffer, 0, chunkSize); 
      if (length == 0) 
       return; 

      chunkAction(buffer, length); 
     } 
     while (true); 
    } 
} 
1

我试着用CLOB仍然得到输入字符串太长。

这是不正确的。

documentation

包含单字节或多字节 字符的字符大对象。固定宽度和可变宽度字符集均支持 ,均使用数据库字符集。 最大大小为(4 千兆字节 - 1)*(数据库块大小)

例如,

SQL> CREATE TABLE t_clob(col CLOB); 

Table created. 

SQL> INSERT 
    2 INTO t_clob VALUES 
    3 (
    4  TO_CLOB(RPAD('*', 4000, '*')) 
    5  ||RPAD('*', 4000, '*') 
    6  ||RPAD('*', 4000, '*') 
    7 ); 

1 row created. 

SQL> SELECT LENGTH(col) FROM t_clob; 

LENGTH(COL) 
----------- 
     12000 

与Oracle 12C开始,VARCHAR2的最大尺寸是现在扩展32767字节。默认情况下,参数MAX_STRING_SIZE标准,它可以容纳4000个字节。

SQL> show parameter MAX_STRING_SIZE 

NAME         TYPE  VALUE 
------------------------------------ ----------- ------------------------------ 
max_string_size      string  STANDARD 

你可以改变的参数值扩展,增加VARCHAR2的最大值为32767个字节。

主要有两个重要的步骤:

ALTER SYSTEM SET max_string_size=extended; 

@?/rdbms/admin/utl32k 
+1

很好的解释先生 – Smart003

+0

有趣的事情是'INSERT INTO t_clob VALUES(RPAD( '*',, '*'));'可以执行没有错误与大于VARCHAR2的限制,但实际上只插入了最大允许的字符数。 – Husqvik

+0

@Husqvik是的,这是对字符串大小的SQL限制。我错过了使用** TO_CLOB **。更新了答案。感谢您指出。 –