我想在C#&#34中选择来自流水线功能的数据;及时#34;。这意味着该函数每秒管道一行(如状态报告),我想立即在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));
}
我的示例函数在PIPE ROW之前返回n(唯一的函数参数)行,睡眠时间为1秒。如果我运行此代码,我必须等待十秒钟,直到我一次得到十行。
但如果我第二次运行它完美运行,我每秒会得到一行(总共十行)。也许只是因为Statement Caching,当我添加行
cmd.AddToStatementCache = false;
即使在第二轮比赛中,我也会获得十行音乐。
所以问题是:任何人都知道如何获得十行"及时#34; (当我第一次执行代码时,每秒一行一行?)
非常感谢!
干杯 基督教
答案 0 :(得分: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;
/
不幸的是,即使在RapidSQL中,它也会在10秒后返回。所以要么我实现了错误,要么SLEEP功能会破坏回传的管道行。