c# - 输出参数 totalCount 和行 SYS_REFCURSOR Oracle
问题描述
在oracle中,我想要totalCount和rows,我做了以下事情:
create or replace PACKAGE BODY PA_MYPACKAGE
IS
PROCEDURE sp_myProcedure(p_nam IN Varchar2
, p_totalCount OUT NUMBER
, p_recordset OUT SYS_REFCURSOR)
AS
BEGIN
SELECT COUNT(*) INTO p_totalCount FROM myTABLE WHERE name = p_name;
OPEN p_recordset FOR
SELECT
myTABLE.id
, myTABLE.name
, myTable.Description FROM myTABLE
WHERE name = p_name
OFFSET 0 ROW
FETCH NEXT 10 ROW ONLY;
END;
如果有多个条件,这是不好的。我试过了
create or replace PACKAGE BODY PA_MYPACKAGE
IS
PROCEDURE sp_myProcedure(p_nam IN Varchar2
, p_totalCount OUT NUMBER
, p_recordset OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_recordset FOR
SELECT
myTABLE.id
, myTABLE.name
, myTable.Description FROM myTABLE
, count(*) over() as totalCount
WHERE name = p_name;
END;
但我不能设置 P_totalCount = totalCount;
我怎样才能得到它们?
解决方案
让我看看我是否理解你的问题。检查我的演示
首先:我们创建一个包含一些记录的表格演示
SQL> create table t ( id number generated always as identity , name varchar2(20) , description varchar2(100) );
Table created.
SQL> declare
2 begin
3 for r in 1 .. 100
4 loop
5 insert into t ( name , description ) values ( 'John' , dbms_random.string('A',20) ) ;
6 insert into t ( name , description ) values ( 'Peter' , dbms_random.string('A',20) ) ;
7 insert into t ( name , description ) values ( 'Frank' , dbms_random.string('A',20) ) ;
8 end loop ;
9 commit;
10* end;
SQL> /
PL/SQL procedure successfully completed.
第二:我们创建一个与您类似的程序
SQL> create or replace procedure pr_t
2 ( p_name in varchar2
3 , p_totalCount out number
4 , p_recordset out sys_refcursor
5 )
6 as
7 begin
8 select count(*) into p_totalcount from t where name = p_name;
9 open p_recordset for
10 select
11 t.id
12 , t.name
13 , t.description from t
14 where name = p_name
15 offset 0 row
16 fetch next 10 row only;
17* end;
SQL> /
Procedure created.
第三:现在我们调用它来同时获取每一行中的行数和计数器
SQL> declare
2 l_cursor sys_refcursor;
3 l_counter pls_integer;
4 l_id t.id%type;
5 l_name t.name%type;
6 l_desc t.description%type;
7 begin
8 pr_t ( p_name => 'Frank' , p_totalCount => l_counter, p_recordset => l_cursor );
9 loop
10 fetch l_cursor
11 into l_id, l_name, l_desc;
12 exit when l_cursor%notfound;
13 dbms_output.put_line(l_id || ' | ' || l_name || ' | ' || l_desc || ' | ' || l_counter);
14 end loop;
15 close l_cursor;
16* end;
/
100003 | Frank | ZDsZwyzfgCXolJFDblrW | 100
100006 | Frank | ozCQpfGPMeqquejqDRNx | 100
100009 | Frank | XYiOFtujYLOoPbemCNSx | 100
100012 | Frank | GIurWAfHjuRLYRzzAFuI | 100
100015 | Frank | TKFzFoqkwInGxtvrLnev | 100
100018 | Frank | SDPlYbTdjTgPkjnwUCBb | 100
100021 | Frank | RSbdHGsJGIlIXrJoxHuY | 100
100024 | Frank | VUywFEDzbAfvTtUfjYJQ | 100
100027 | Frank | SnwfqTykxPISKVbGQCED | 100
100030 | Frank | CwTnIPrOfXiqsAuvXays | 100
PL/SQL procedure successfully completed.
推荐阅读
- java - 如何实现二维对象数组?
- python - Kivy 如何渲染它的 uix 组件,比如 VideoPlayer?
- python-2.6 - 带有 Python2 的 MonetDB 听诊器?
- docker - 如何将文件夹挂载为 docker image build 创建的卷?
- android - WebServices 不适用于改造,但在 Postman 中正常工作
- plot - 在 Octave 的 3d 散点图中制作一个立方体
- c# - 无法手动将项目添加到通过列表迭代填充的列表框
- python - 如何在 Django 中调用异步函数?
- r - 当使用两个数字作为输入时,为什么 cbind 会为 c 提供不同的输出?
- linux - Apache - 排除本地网络以重定向 HTTPS