cmd. execuescalar()工作,但抛出ORA-25191异常



我的代码正在工作,该函数给了我正确的选择计数(*)值,但无论如何,它抛出ORA-25191异常-不能引用索引组织表提示的溢出表,at 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

如果您正在使用与数据库无关的API,如ADO。Net中,您几乎总是希望使用API的框架来获取元数据,而不是针对每个数据库的元数据表编写自定义查询。各种ADO。网络提供者更有可能编写数据字典查询来处理所有不同的极端情况,并且比您可能编写的查询更有可能进行优化。因此,与其编写自己的查询来填充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(*),所以如果你的模式碰巧包含嵌套表,你也会想要一个nested = 'NO'谓词。根据您的模式所使用的特性的确切集合,提供商的开发人员可能还会添加一些您必须处理的代码。

开始
select *
from user_tables
where (   iot_type IS NULL
or iot_type != 'IOT_OVERFLOW')
and dropped = 'NO'
and nested = 'NO'

,但要知道您可能需要/想要添加一些额外的过滤器,这取决于用户使用的特定功能。我当然更愿意让那些开发ADO的人去做。网络提供商担心的是所有这些角落的情况,而不是自己去寻找它们。

退后一步,我想问为什么你经常在模式中的每个表上做count(*),为什么你需要一个确切的答案。在大多数情况下,你在做什么,你不是做一次性的,你不太关心需要多长时间(即验证步骤迁移后)或近似计数就足够了(即获得最大的一组表在系统中为了分流一些努力或跟踪增长随着时间的预测)在这种情况下,您可以使用计数已经存储在数据字典——user_tables.num_rows——从最后一次运行统计数据。

这篇文章帮助我解决了我的问题。

我已经改变了我的查询如下:

SELECT * FROM user_tables 
WHERE iot_type IS NULL OR iot_type != 'IOT_OVERFLOW' 
ORDER BY TABLE_NAME

相关内容

  • 没有找到相关文章

最新更新