我的代碼正在運行,該函式為我提供了正確的 Select count (*) 值,但無論如何,它會引發 ORA-25191 例外 - 無法參考索引組織表提示的溢位表,位于 retVal = Convert.ToInt32(cmd.ExecuteScalar ());
由于我經常使用該函式,例外會極大地減慢我的程式速度。
private int getSelectCountQueryOracle(string Sqlquery)
{
try
{
int retVal = 0;
using (DataTable dataCount = new DataTable())
{
using (OracleCommand cmd = new OracleCommand(Sqlquery))
{
cmd.CommandType = CommandType.Text;
cmd.Connection = oraCon;
using (OracleDataAdapter dataAdapter = new OracleDataAdapter())
{
retVal = Convert.ToInt32(cmd.ExecuteScalar());
}
}
}
return retVal;
}
catch (Exception ex)
{
exceptionProtocol("Count Function", ex.ToString());
return 1;
}
}
這個函式在foreach回圈中被呼叫
// function call in foreach loop which goes through tablenames
foreach (DataRow row in dataTbl.Rows)
{...
tableNameFromRow = row["TABLE_NAME"].ToString();
tableRows=getSelectCountQueryOracle("select count(*) as 'count' from " tableNameFromRow);
tableColumns = getSelectCountQueryOracle("SELECT COUNT(*) as 'count' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='" tableNameFromRow "'");
...}
dataTbl.rows 在這個外回圈中,反過來,來自查詢
SELECT * FROM USER_TABLES ORDER BY TABLE_NAME
uj5u.com熱心網友回復:
如果您使用的是 ADO.Net 之類的與資料庫無關的 API,您幾乎總是希望使用 API 的框架來獲取元資料,而不是針對每個資料庫的元資料表撰寫自定義查詢。各種 ADO.Net 提供程式更有可能撰寫處理所有各種極端情況的資料字典查詢,并且比您可能撰寫的查詢更有可能被優化。因此,與其撰寫自己的查詢來填充dataTbl資料表,不如使用GetSchema方法
DataTable dataTbl = connection.GetSchema("Tables");
如果出于某種原因要保留自定義編碼的資料字典查詢,則需要過濾掉 IOT 溢位表,因為您無法直接查詢這些表。
select *
from user_tables
where iot_type IS NULL
or iot_type != 'IOT_OVERFLOW'
但是請注意,您可能不想嘗試從中獲取計數的其他表。例如,該dropped列指示表是否已被洗掉——大概,您不想計算回收站中物件的行數。所以你也需要一個dropped = 'NO'謂詞。并且您不能count(*)對嵌套表執行 a 操作,因此nested = 'NO'如果您的架構碰巧包含嵌套表,您也希望有一個謂詞。可能還有其他極端情況,具體取決于您的特定模式使用的確切功能集,提供者的開發人員已為您添加了必須處理的代碼。
uj5u.com熱心網友回復:
這篇文章幫助我解決了我的問題。
我已將查詢更改為:
SELECT * FROM user_tables
WHERE iot_type IS NULL OR iot_type != 'IOT_OVERFLOW'
ORDER BY TABLE_NAME
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/339638.html
上一篇:如何減少MSAA記憶體使用量?
下一篇:Java嘗試捕捉例外
