爲了能夠讀一列,它是LONG
數據類型的OracleCommand
的InitialLONGFetchSize
屬性必須被設置爲無零(默認零)值:
可惜你沒有提供您的.NET代碼,所以我給你一個C#+ ODP.NET非託管司機例如:
設置:
create table t1(
col1 varchar2(11)
);
create index FBI on t1(upper(col1));
table T1 created.
index FBI created.
C#代碼:
string oraConnectionString = "Data source=nkpdb;User id=hr;password=password;";
OracleConnection oraConnection = new OracleConnection(oraConnectionString);
oraConnection.Open();
/* Would be better to put this in a stored procedure */
string sqlQuery = "select ic.column_name " +
" , ie.column_expression " +
" from all_ind_columns ic " +
" left join all_ind_expressions ie " +
" on ie.index_owner = ic.index_owner " +
" and ie.index_name = ic.index_name " +
" and ie.column_position = ic.column_position " +
" where ic.index_owner = :INDOwner " +
" and ic.index_name = :INDName" ;
OracleCommand oraCmd = new OracleCommand(sqlQuery, oraConnection);
OracleParameter indOwner = new OracleParameter("INDOwner",
OracleDbType.Varchar2);
OracleParameter indName = new OracleParameter("INDName",
OracleDbType.Varchar2);
indOwner.Value = "HR";
indName.Value = "FBI";
oraCmd.Parameters.Add(indOwner);
oraCmd.Parameters.Add(indName);
/* set up initial amount of data that the OracleDataReader
* fetches for LONG column */
oraCmd.InitialLONGFetchSize = 1000; /* set initial size */
OracleDataReader oraDataReader = oraCmd.ExecuteReader();
if (oraDataReader.HasRows)
{
while (oraDataReader.Read())
{
Console.WriteLine(oraDataReader.GetString(
oraDataReader.GetOrdinal("column_expression")));
}
}
結果:
默認情況下,InitialLONGFetchSize
屬性設置爲0。這就是爲什麼你得到一個空字符串的原因。因此,您需要將此屬性設置爲大於零的值或將其設置爲-1以獲取整個LONG
列。
的InitialLONGFetchSize屬性設置所做的工作對我來說。我只關心它對查詢性能的任何影響。如果我確定返回的數據的長度不會超過100,那麼將值設置爲-1會對性能產生不利影響,而不是像100那樣設置顯式值? –
@RahulVijayDawda不,在這種情況下,不應該有任何主要的表現處罰。但是,根據一般經驗,您將'InitialLONGFetchSize'設置爲比LONG值大一點的值,則80%(或更多)的行將返回。當然,將這個屬性設置爲-1並不是一個好主意,例如,如果LONG列的大小爲5Kb的行的95%和10Mb的行的5% - 總體響應時間將取決於該行5行的百分比。 –