【发布时间】:2017-03-11 00:19:27
【问题描述】:
通常,对 sql 语句执行“解释计划”会导致记录插入到 plan_table 中。当通过 TOAD 执行时,这对我来说很好。我的要求是通过我的 c# 应用程序(Oracle.DataAccess.Client lib)执行此操作。不幸的是,在 TOAD 上工作的同一语句在 C# 中执行时不会导致将任何记录插入 plan_table。
奇怪的是,尽管没有记录插入到表中,但我确定在 C# 中执行时会消耗 plan_id 序列。我可以通过在 TOAD 中执行新的解释计划来确认这一点,并注意到 plan_id 序列已根据我通过 C# 进行的尝试次数跳过。 Notice how it went from 44 to 50.
我需要特别解释计划的原因是我想在执行之前获取给定查询中涉及的表和列的列表。我考虑过语法解析,但考虑到 plan_table 记录包含我想要的数据,感觉就像是在重新发明轮子。
出于所有意图和目的,同一用户登录 TOAD 和 C#,因此我不怀疑权限有限。我尝试了有无承诺。我还尝试将解释计划放在存储过程中,并在 C# 中调用它,结果相同。 (在 TOAD 上按预期工作,但在 C# 上没有插入记录)。为了让它在存储过程中工作,我必须让它立即执行。
myoracon.Open();
OracleCommand myoracom = myoracon.CreateCommand();
myoracom = new OracleCommand("explain plan set statement_id = 'xd' for select * from employee", myoracon);
OracleTransaction trx;
trx = myoracom.Connection.BeginTransaction();
myoracom.Transaction = trx;
myoracom.ExecuteNonQuery();
trx.Commit();
myoracon.Close();
所以,在这一切之后,我的问题如下:为什么 C# 中的解释计划不会导致将记录插入到 plan_table 中,我该怎么做才能让它工作?
提前致谢!
【问题讨论】:
标签: c# oracle stored-procedures oracle11g