首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ODP.NET中执行流水线函数

在ODP.NET中执行流水线函数
EN

Stack Overflow用户
提问于 2014-02-04 21:38:06
回答 1查看 1.1K关注 0票数 1

我想从C#中的一个流水线函数中“及时”选择数据。这意味着该函数每秒输出一行(就像状态报告一样),而我希望立即从C#中获取数据。

到目前为止,我有以下几点:

代码语言:javascript
复制
        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(惟一的Function-Parameter)行,在管道行之前休眠一秒。如果我运行这段代码,我必须等待10秒钟,直到我一次得到10行。

但是如果我第二次运行它,它可以完美地工作,我每秒会得到一行(总共10行)。也许只是因为语句缓存,当我添加这行代码时

代码语言:javascript
复制
cmd.AddToStatementCache = false; 

即使在第二次运行时,我也得到了10行代码块。

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

非常感谢!

为基督徒干杯

EN

回答 1

Stack Overflow用户

发布于 2014-11-21 03:23:11

我试着重现你的功能。

代码语言:javascript
复制
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中也是如此。所以,要么是我实现错了,要么是睡眠函数中断了返回的管道行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21554071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档