Как я могу получить набор результатов из Oracle PL / SQL? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть таблица ниже:

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, но, похоже, в этом случае он не работает.

Я хочу сделать хранимую процедуру с этим кодом.

Пожалуйста, кто-нибудь научит меня, как ее решить, или скажите, что мне следует изучить.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете получить желаемый результат из одного SQL-запроса и передать указатель вывода.FETCH это CURSOR в вашем коде 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, особенно для больших наборов данных.

0 голосов
/ 21 мая 2018

Вы можете преобразовать его в хранимую процедуру, которая возвращает курсор.Но гораздо проще избавиться от PL / SQL и использовать простой запрос SQL:

SELECT seq, amt
FROM jun_t;

Затем вычислите сумму в C #.При необходимости выполните преобразование в одну строку, разделенную запятой, также в C #.Это гораздо проще, чем управлять кодом в двух местах и ​​использовать курсоры ref.

КСТАТИ: шаблон OPEN курсора / LOOP / FETCH INTO / EXIT WHEN полностью устарел.

...