Plsql 如何在PL/SQL中编写查询,使用游标从Account表中查找3个最大余额?

Plsql 如何在PL/SQL中编写查询,使用游标从Account表中查找3个最大余额?,plsql,top-n,Plsql,Top N,我试图在帐户表上找到3个最大余额,但它不起作用 您不需要PL/SQL或游标: DECLARE CUSTID NUMBER; ANO NUMBER; BALANC NUMBER; TYP ACCOUNT.TYPE%TYPE; STATU ACCOUNT.STATUS%TYPE; CURSOR S IS SELECT * FROM ACCOUNT WHERE STATUS = 'active'; BEGIN OPEN S; FOR A IN 1..3 LOOP

我试图在帐户表上找到3个最大余额,但它不起作用

您不需要PL/SQL或游标:

DECLARE
     CUSTID NUMBER; ANO NUMBER; BALANC NUMBER; TYP ACCOUNT.TYPE%TYPE; STATU ACCOUNT.STATUS%TYPE;
     CURSOR S IS SELECT *  FROM ACCOUNT WHERE STATUS = 'active';
BEGIN
    OPEN S;
     FOR A IN 1..3 LOOP
        FETCH S 
        DBMS_OUTPUT.PUT_LINE('CUST ID : '||CUSTID||'   NO:'||ANO || '  TYPE :' || TYP || '   STATUS :' || STATU); 
     END LOOP;
CLOSE S;
END;
declare
  CURSOR S IS SELECT *  FROM ACCOUNT WHERE STATUS = 'active';
  v_row account%rowtype;
begin
  OPEN S;
     FOR A IN 1..3 LOOP
        FETCH S into v_row;
        DBMS_OUTPUT.PUT_LINE('CUST ID : '||v_row.CUSTID||'   NO:'||v_row.ANO || '  TYPE :' || v_row.TYP || '   STATUS :' || v_row.STATU); 
     END LOOP;
CLOSE S;
end;

就像@a_horse_没有写名字一样,您不需要pl/sql来实现这一点。事实上,如果你有Oracle12c,你甚至可以按偏移量排序。如果您真的想在pl/sql中执行此操作,则需要更改该fetch,并添加INTO子句,为此,您需要一个rowtype变量:

SELECT * 
FROM 
  SELECT a.*,
         dense_rank() over (order by balance desc) as rnk
  FROM account 
  WHERE status = 'active' 
) t
WHERE rnk <= 3;

附言:有很多更好的方法可以做到这一点。我只是在修改你的代码。

有一个简单的查询:

DECLARE
     CUSTID NUMBER; ANO NUMBER; BALANC NUMBER; TYP ACCOUNT.TYPE%TYPE; STATU ACCOUNT.STATUS%TYPE;
     CURSOR S IS SELECT *  FROM ACCOUNT WHERE STATUS = 'active';
BEGIN
    OPEN S;
     FOR A IN 1..3 LOOP
        FETCH S 
        DBMS_OUTPUT.PUT_LINE('CUST ID : '||CUSTID||'   NO:'||ANO || '  TYPE :' || TYP || '   STATUS :' || STATU); 
     END LOOP;
CLOSE S;
END;
declare
  CURSOR S IS SELECT *  FROM ACCOUNT WHERE STATUS = 'active';
  v_row account%rowtype;
begin
  OPEN S;
     FOR A IN 1..3 LOOP
        FETCH S into v_row;
        DBMS_OUTPUT.PUT_LINE('CUST ID : '||v_row.CUSTID||'   NO:'||v_row.ANO || '  TYPE :' || v_row.TYP || '   STATUS :' || v_row.STATU); 
     END LOOP;
CLOSE S;
end;
将其嵌入到查询中

select * from(select * from account order by balance desc)where rownum<=3

也许您只需要在查询中使用“ORDER BY BALANCE desc”?您不需要游标或PL/SQL,因为它不起作用,也没有多大帮助。很明显,通过查看您的代码,我们可以猜出可能出了什么问题。但我们为什么要猜测呢?你应该告诉我们当你运行你的代码时会发生什么,如果你得到了错误,等等!它可以工作,但我仍然需要3个最大余额..>>从帐户中选择*状态=‘活动’订单,按余额说明;