1

我想“及时”从 C# 中的流水线函数中选择数据。这意味着该函数每秒传输一行(如状态报告),我想立即在 C# 中获取数据。

到目前为止,我有以下内容:

        Oracle.DataAccess.Client.OracleConnection con = new Oracle.DataAccess.Client.OracleConnection("my_connection_string");

        con.Open();

        Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("SELECT * FROM TABLE(MYPACKAGE.TEST_PIPELINE(10))", con);
        cmd.CommandType = CommandType.Text;

        Oracle.DataAccess.Client.OracleDataReader reader = cmd.ExecuteReader();

        reader.FetchSize = 244;  //record-size in Bytes

        while (reader.Read())
        {
            System.Diagnostics.Debug.WriteLine("Now: " + DateTime.Now.ToString("HH:mm:ss.ffff"));
            System.Diagnostics.Debug.WriteLine("ID: " + reader.GetValue(0));
            System.Diagnostics.Debug.WriteLine("Text: " + reader.GetValue(1));
        }

我的示例函数返回 n(唯一的函数参数)行,在 PIPE ROW 之前休眠一秒。如果我运行这段代码,我必须等待十秒钟,直到我一次得到十行。

但是,如果我第二次运行它,它会完美运行,我每秒会得到一行(总共十行)。也许只是因为语句缓存,当我添加该行时

cmd.AddToStatementCache = false; 

即使在第二次运行时,我也会得到一个十行的块。

所以问题是:当我第一次执行代码时,任何人都知道如何“及时”(每秒逐行)获得十行?

非常感谢!

干杯基督徒

4

1 回答 1

0

我试图重现你的功能。

CREATE OR REPLACE PACKAGE BODY PHXDBA.PIPETEST as
    FUNCTION TENSECOND RETURN TENSECOND_TT 
    PIPELINED AS
    ctr NUMBER;
    ts_ot TENSECOND_OT := TENSECOND_OT(NULL);
    BEGIN
        FOR ctr IN 1..10
        LOOP
            ts_ot.CNT := ctr;
            PIPE ROW (ts_ot);
            SYS.DBMS_LOCK.SLEEP(1);
        END LOOP;
    END;
END PIPETEST;
/

不幸的是,这总是在 10 秒后返回,即使在 RapidSQL 中也是如此。所以要么我实现错了,要么 SLEEP 函数破坏了返回的管道行。

于 2014-11-20T19:23:10.933 回答