我有一個.Net應用程序連接oracle數據庫,並希望輸入超過4000個字符到數據庫中的列。輸入大量的內容到oracle數據庫
我試着用CLOB仍然得到
輸入字符串太長。
我正在使用SQL查詢輸入任何幫助的數據。
我有一個.Net應用程序連接oracle數據庫,並希望輸入超過4000個字符到數據庫中的列。輸入大量的內容到oracle數據庫
我試着用CLOB仍然得到
輸入字符串太長。
我正在使用SQL查詢輸入任何幫助的數據。
最簡單的方法是使用綁定變量。下面是簡單的例子:
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);
}
}
我試着用CLOB仍然得到輸入字符串太長。
這是不正確的。
包含單字節或多字節 字符的字符大對象。固定寬度和可變寬度字符集均支持 ,均使用數據庫字符集。 最大大小爲(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
很好的解釋先生 – Smart003
有趣的事情是'INSERT INTO t_clob VALUES(RPAD( '*',, '*'));'可以執行沒有錯誤與大於VARCHAR2的限制,但實際上只插入了最大允許的字符數。 –
Husqvik
@Husqvik是的,這是對字符串大小的SQL限制。我錯過了使用** TO_CLOB **。更新了答案。感謝您指出。 –