Plsql 如何在PL/SQL中编写查询,使用游标从Account表中查找3个最大余额?
我试图在帐户表上找到3个最大余额,但它不起作用 您不需要PL/SQL或游标: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
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个最大余额..>>从帐户中选择*状态=‘活动’订单,按余额说明;