簡體   English   中英

如何從Oracle PL / SQL獲取結果集?

[英]How can I get result set from Oracle PL/SQL?

我有一張桌子:

CREATE TABLE jun_t AS
SELECT 1 seq, -2000 amt FROM dual
UNION ALL SELECT 2, 4000 FROM dual
UNION ALL SELECT 3, -5000 FROM dual
UNION ALL SELECT 4, -2000 FROM dual
UNION ALL SELECT 5, 3000 FROM dual
UNION ALL SELECT 6, 1500 FROM dual
UNION ALL SELECT 7, -250 FROM dual
UNION ALL SELECT 8, 320 FROM dual
UNION ALL SELECT 9, -4000 FROM dual
UNION ALL SELECT 10, 10000 FROM dual
UNION ALL SELECT 11, -20000 FROM dual;

而且我有事要做,所以我在下面創建並執行了一個pl / sql程序:

DECLARE

    CURSOR csr is
    select seq, amt
    from jun_t;

    rec csr%ROWTYPE;
    total jun_t.amt%TYPE;

BEGIN

    OPEN csr;

    total := 0;
    LOOP
        FETCH csr into rec;
        EXIT WHEN csr%NOTFOUND;

        IF (rec.amt + total) > 0 THEN
            total := rec.amt + total;
        ELSE
            total := 0;
        END IF;

        dbms_output.put_line(rec.seq || ',' || rec.amt || ',' || total);

    END LOOP;

END;

結果是這樣的:

1,-2000,0
2,4000,4000
3,-5000,0
4,-2000,0
5,3000,3000
6,1500,4500
7,-250,4250
8,320,4570
9,-4000,570
10,10000,10570
11,-20000,0

問題是這樣的。 我想在我的C#應用​​程序中使用此結果集,但我找不到方法...我看到了一個使用ref游標的示例代碼,但在這種情況下似乎不起作用。

我想用此代碼制作存儲過程。

請有人教我一種解決方法,或者告訴我我應該學習什么。

謝謝。

您可以將其轉換為返回游標的存儲過程。 但是擺脫PL / SQL並使用簡單的SQL查詢要容易得多:

SELECT seq, amt
FROM jun_t;

然后用C#計算總數。 如果需要,也可以在C#中執行轉換為單個逗號分隔的行。 這比在兩個地方管理代碼和使用ref游標要容易得多。

順便說一句:OPEN光標/ LOOP / FETCH INTO / EXIT WHEN模式已完全過時。

您可以從單個sql查詢中獲得所需的輸出,然后傳遞輸出ref游標。 FETCHCURSOR在C#代碼。

CREATE OR REPLACE PROCEDURE pr_get_total ( p_csr OUT SYS_REFCURSOR )
AS
BEGIN

OPEN p_csr FOR
WITH cte(seq, amt, total) 
     AS (SELECT 0 seq, 
                0 amt, 
                0 total 
         FROM   dual 
         UNION ALL 
         SELECT j.seq AS  seq, 
                j.amt, 
                CASE 
                  WHEN j.amt + total < 0 THEN 0 
                  ELSE j.amt + total 
                END   AS total 
         FROM   jun_t j 
                join cte c 
                  ON j.seq = c.seq + 1) 
SELECT * 
FROM   cte WHERE seq > 0;

END;
/

演示版

注意 :這可能是比簡單的游標中讀取后記錄計算總和紀錄快select * from yourtable ,尤其對於大型數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM