我有一个.Net应用程序连接oracle数据库,并希望在DB中的列中输入超过4000个字符。
我尝试了CLOB仍然
输入字符串太长了。
我正在使用SQL查询输入数据任何帮助。
答案 0 :(得分: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 :(得分:1)
我尝试使用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 为 STANDARD ,最多可容纳4000个字节。
SQL> show parameter MAX_STRING_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
您可以将参数值更改为 EXTENDED ,并将VARCHAR2的最大值增加到32767字节。
主要有两个重要步骤:
ALTER SYSTEM SET max_string_size=extended;
@?/rdbms/admin/utl32k