[英]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游标。 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
,尤其对于大型数据集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.