C# 在C中执行Oracle解释计划
通常,为sql语句执行解释计划会导致将记录插入到计划表中。当通过蟾蜍执行时,这对我来说很好。我的要求是通过我的c应用程序Oracle.DataAccess.Client lib执行此操作。不幸的是,当在C中执行时,在TOAD上工作的同一语句不会导致任何记录插入plan_表 奇怪的是,我确信在C中执行时会使用plan_id序列,尽管表中没有插入任何记录。我可以通过在TOAD中执行一个新的解释计划来确认这一点,并注意到根据我通过C所做的尝试次数,plan_id序列已经跳过 我需要解释计划的原因是,我想在执行之前获取给定查询中涉及的表和列的列表。我考虑过语法解析,但考虑到plan_表记录正好包含我想要的数据,我觉得这就像是重新发明轮子 出于所有目的,同一个用户登录了TOAD和C,所以我不怀疑权限有限。我试过了,但没有承诺。我还尝试将explain计划放在一个存储过程中,并在C中调用它,得到相同的结果。在TOAD上按预期工作,但在C上没有插入任何记录。要使其在存储过程中工作,我必须使其立即执行C# 在C中执行Oracle解释计划,c#,oracle,stored-procedures,oracle11g,C#,Oracle,Stored Procedures,Oracle11g,通常,为sql语句执行解释计划会导致将记录插入到计划表中。当通过蟾蜍执行时,这对我来说很好。我的要求是通过我的c应用程序Oracle.DataAccess.Client lib执行此操作。不幸的是,当在C中执行时,在TOAD上工作的同一语句不会导致任何记录插入plan_表 奇怪的是,我确信在C中执行时会使用plan_id序列,尽管表中没有插入任何记录。我可以通过在TOAD中执行一个新的解释计划来确认这一点,并注意到根据我通过C所做的尝试次数,plan_id序列已经跳过 我需要解释计划的原因是,我
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中的explain plan不会导致将记录插入plan_表中,我该怎么做才能让它工作
提前谢谢 解释计划写在特定的表格plan\U表格中。您需要选择它以查看确切的计划。检查 这会将计划解释为plan_表。然后您可以选择 计划表中的执行计划。如果您没有 计划表中的任何其他计划,或者如果您只想查看最后一个计划 声明 在您的情况下,您将使用您设置的特定ID选择它 因此,您需要另一个到db的连接:
using(OracleConnection conn = new OracleConnection(oradb))
{
conn.Open();
OracleCommand cmd= conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = @"Select * FROM Plan_Table Where ID=@ID";
cmd.Parameters.AddWithValue("@ID", idWhichYouSpecify);
DataTable tbl = new DataTable();
using(OracleDataAdapter da = new OracleDataAdapter(cmd))
{
da.Fill(tbl);
}
}
您是否控制了表:TOAD_PLAN_表,在该表中您在C上运行脚本 如果它不存在,请手动在您的c用户下创建它:
CREATE TABLE **your_user**.TOAD_PLAN_TABLE
(
STATEMENT_ID VARCHAR2(30 BYTE),
PLAN_ID NUMBER,
TIMESTAMP DATE,
REMARKS VARCHAR2(4000 BYTE),
OPERATION VARCHAR2(30 BYTE),
OPTIONS VARCHAR2(255 BYTE),
OBJECT_NODE VARCHAR2(128 BYTE),
OBJECT_OWNER VARCHAR2(30 BYTE),
OBJECT_NAME VARCHAR2(30 BYTE),
OBJECT_ALIAS VARCHAR2(65 BYTE),
OBJECT_INSTANCE INTEGER,
OBJECT_TYPE VARCHAR2(30 BYTE),
OPTIMIZER VARCHAR2(255 BYTE),
SEARCH_COLUMNS NUMBER,
ID INTEGER,
PARENT_ID INTEGER,
DEPTH INTEGER,
POSITION INTEGER,
COST INTEGER,
CARDINALITY INTEGER,
BYTES INTEGER,
OTHER_TAG VARCHAR2(255 BYTE),
PARTITION_START VARCHAR2(255 BYTE),
PARTITION_STOP VARCHAR2(255 BYTE),
PARTITION_ID INTEGER,
OTHER LONG,
DISTRIBUTION VARCHAR2(30 BYTE),
CPU_COST INTEGER,
IO_COST INTEGER,
TEMP_SPACE INTEGER,
ACCESS_PREDICATES VARCHAR2(4000 BYTE),
FILTER_PREDICATES VARCHAR2(4000 BYTE),
PROJECTION VARCHAR2(4000 BYTE),
TIME INTEGER,
QBLOCK_NAME VARCHAR2(30 BYTE),
OTHER_XML CLOB
)
谢谢你的回复。我没有提到这仍然是一个概念证明,我只是想检查解释计划是否会成功执行。目前,我正在通过TOAD手动查找plan_表,检查解释计划在C中执行时是否按预期工作。@Mr.Wright您也可以像我写的那样从C中的plan_表加载信息。哇,非常感谢。真不敢相信事情竟那么简单!我将上面的创建脚本与我的环境的plan_表的实际描述进行了比较。另一个_XML列的位置与非常小的细节不同,但我只是对它进行了测试,它成功了。我想问题在于需要在我的模式中定义PLAN_表。再次感谢!:D
CREATE TABLE **your_user**.TOAD_PLAN_TABLE
(
STATEMENT_ID VARCHAR2(30 BYTE),
PLAN_ID NUMBER,
TIMESTAMP DATE,
REMARKS VARCHAR2(4000 BYTE),
OPERATION VARCHAR2(30 BYTE),
OPTIONS VARCHAR2(255 BYTE),
OBJECT_NODE VARCHAR2(128 BYTE),
OBJECT_OWNER VARCHAR2(30 BYTE),
OBJECT_NAME VARCHAR2(30 BYTE),
OBJECT_ALIAS VARCHAR2(65 BYTE),
OBJECT_INSTANCE INTEGER,
OBJECT_TYPE VARCHAR2(30 BYTE),
OPTIMIZER VARCHAR2(255 BYTE),
SEARCH_COLUMNS NUMBER,
ID INTEGER,
PARENT_ID INTEGER,
DEPTH INTEGER,
POSITION INTEGER,
COST INTEGER,
CARDINALITY INTEGER,
BYTES INTEGER,
OTHER_TAG VARCHAR2(255 BYTE),
PARTITION_START VARCHAR2(255 BYTE),
PARTITION_STOP VARCHAR2(255 BYTE),
PARTITION_ID INTEGER,
OTHER LONG,
DISTRIBUTION VARCHAR2(30 BYTE),
CPU_COST INTEGER,
IO_COST INTEGER,
TEMP_SPACE INTEGER,
ACCESS_PREDICATES VARCHAR2(4000 BYTE),
FILTER_PREDICATES VARCHAR2(4000 BYTE),
PROJECTION VARCHAR2(4000 BYTE),
TIME INTEGER,
QBLOCK_NAME VARCHAR2(30 BYTE),
OTHER_XML CLOB
)