Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中执行Oracle解释计划_C#_Oracle_Stored Procedures_Oracle11g - Fatal编程技术网

C# 在C中执行Oracle解释计划

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序列已经跳过 我需要解释计划的原因是,我

通常,为sql语句执行解释计划会导致将记录插入到计划表中。当通过蟾蜍执行时,这对我来说很好。我的要求是通过我的c应用程序Oracle.DataAccess.Client lib执行此操作。不幸的是,当在C中执行时,在TOAD上工作的同一语句不会导致任何记录插入plan_表

奇怪的是,我确信在C中执行时会使用plan_id序列,尽管表中没有插入任何记录。我可以通过在TOAD中执行一个新的解释计划来确认这一点,并注意到根据我通过C所做的尝试次数,plan_id序列已经跳过

我需要解释计划的原因是,我想在执行之前获取给定查询中涉及的表和列的列表。我考虑过语法解析,但考虑到plan_表记录正好包含我想要的数据,我觉得这就像是重新发明轮子

出于所有目的,同一个用户登录了TOAD和C,所以我不怀疑权限有限。我试过了,但没有承诺。我还尝试将explain计划放在一个存储过程中,并在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中的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
)