如何从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 游标要容易得多。

顺便说一句:当模式完全过时时,打开光标/循环/获取进入/退出。

您可以从单个 sql 查询中获取所需的输出并传递输出引用游标。 在 C# 代码中FETCHCURSOR

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获取后逐条记录计算总和更快,尤其是对于大型数据集。

相关内容

  • 没有找到相关文章

最新更新