2015-11-13 43 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 **。更新了答案。感謝您指出。 –