Oracle中的存储过程和VB.NET中的IDataReader.Read()



我有一个似乎很慢的存储过程。

在Oracle SQL Developer中执行

SET TIMING ON;
DECLARE
  CUR_OUT UTILS.T_CURSOR;
  P_ARTTYID NUMBER;
  P_ORDERST VARCHAR2(200);
  P_DRUMNO VARCHAR2(200);
  P_SHIPPINGNO VARCHAR2(200);
  P_DELIVERYDATEFROM DATE;
BEGIN
  P_ARTTYID := 2;
  P_ORDERST := '3';
  P_DRUMNO := '611-480';
  P_SHIPPINGNO := NULL;
  P_DELIVERYDATEFROM := '2005-01-01';
  C_T_ORDER_GETOVERVIEW(
    CUR_OUT => CUR_OUT,
    P_ARTTYID => P_ARTTYID,
    P_ORDERST => P_ORDERST,
    P_DRUMNO => P_DRUMNO,
    P_SHIPPINGNO => P_SHIPPINGNO,
    P_DELIVERYDATEFROM => P_DELIVERYDATEFROM
  );
  --DBMS_OUTPUT.PUT_LINE('CUR_OUT = ' || CUR_OUT); -- Doesn´t work ;|
END;

给出"语句输出"

anonymous block completed
139ms elapsed

现在的问题是当我从我的VB调用它。. NET应用程序Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader()返回一个System.Data. data . .IDataReader和下面的函数将IDataReader转换为DataSet

    Public Shared Function ConvertIDataReaderToDataSet(ByVal reader As IDataReader) As DataSet
        Dim schemaTable As DataTable = reader.GetSchemaTable()
        Dim dataTable As DataTable = New DataTable
        For intCounter As Integer = 0 To schemaTable.Rows.Count - 1
            Dim dataRow As DataRow = schemaTable.Rows(intCounter)
            Dim columnName As String = CType(dataRow("ColumnName"), String)
            Dim column As DataColumn = New DataColumn(columnName, CType(dataRow("DataType"), Type))
            dataTable.Columns.Add(column)
        Next
        Dim dataSet As DataSet = New DataSet
        dataSet.Tables.Add(dataTable)
        'dataSet.Load(reader, LoadOption.OverwriteChanges, dataTable) ' DEBUG
        While reader.Read()
            Dim dataRow As DataRow = dataTable.NewRow()
            For intCounter As Integer = 0 To reader.FieldCount - 1
                dataRow(intCounter) = reader.GetValue(intCounter)
            Next
            dataTable.Rows.Add(dataRow)
        End While
        Return dataSet
    End Function

调试和遍历函数到"While reader.Read()"行结束。还尝试了使用DataSet.Load()的另一个版本,但结果相同。

在MSDN上发现了这个线程,其他有同样问题的人似乎已经通过添加索引来调整查询来解决了这个问题。

我怎么能继续调查问题,当它看起来像过程工作(响应在~100 - 200ms)和IDataReader.Read()刚刚结束(或继续在后台?)

  • 我可以用另一种(更好的)方法来计时吗?
  • 可以有任何表或事务锁涉及?

我们非常感谢所有的建议

您在SQL Developer中的测试只是测量打开游标所需的时间。打开游标并不会导致Oracle实际执行查询——直到您从游标中获取数据,并且每次获取数据时,Oracle将继续处理查询以获取下一组行。通常,Oracle不需要在任何时间点执行整个查询。要进行类似的测试,PL/SQL块需要从游标中获取所有数据。就像

DECLARE
  CUR_OUT UTILS.T_CURSOR;
  P_ARTTYID NUMBER;
  P_ORDERST VARCHAR2(200);
  P_DRUMNO VARCHAR2(200);
  P_SHIPPINGNO VARCHAR2(200);
  P_DELIVERYDATEFROM DATE;
BEGIN
  P_ARTTYID := 2;
  P_ORDERST := '3';
  P_DRUMNO := '611-480';
  P_SHIPPINGNO := NULL;
  P_DELIVERYDATEFROM := '2005-01-01';
  C_T_ORDER_GETOVERVIEW(
    CUR_OUT => CUR_OUT,
    P_ARTTYID => P_ARTTYID,
    P_ORDERST => P_ORDERST,
    P_DRUMNO => P_DRUMNO,
    P_SHIPPINGNO => P_SHIPPINGNO,
    P_DELIVERYDATEFROM => P_DELIVERYDATEFROM
  );
  LOOP
    FETCH cur_out
     INTO <<list of variables to fetch data into>>;
    EXIT WHEN cur_out%notfound;
  END LOOP;
  --DBMS_OUTPUT.PUT_LINE('CUR_OUT = ' || CUR_OUT); -- Doesn´t work ;|
END;

你是说在你的。net代码中,reader.Read()行永远不会返回吗?或者你是说你的代码在那个点中止了?

相关内容

  • 没有找到相关文章

最新更新