PL / SQL使用函数显示多个记录

时间:2017-10-11 08:23:14

标签: sql plsql oracle11g

我有一个表Iss_rec,其中包含以下字段:

Iss_No
Iss_date
Mem_No
Book_No
Fine

我需要使用用户定义的函数打印具有最大罚款的记录。 如果它只是一个记录我可以轻松打印,但对于多行我不知道该怎么做。在线搜索向我展示了人们使用游标的结果,但我想单独使用函数来实现。

让我们说数据是:

165 12-Apr-14 15677 978453 50  
166 18-Jun-14 15678 978454 50  
167 29-Sep-14 15679 978455 25  
168 1-Oct-14  15677 978456 0  
169 6-Nov-14  15676 978457 0

现在我想要打印前两个记录,因为它们使用用户定义的函数具有最大值。

这样的东西?

create or replace function maxf
return number is
total number;
begin
select r.mem_no into total from iss_rec r group by r.mem_no having 
r.fine=max(r.fine); return total;
end;
/

2 个答案:

答案 0 :(得分:0)

如果您只想选择具有最高罚款的行,您可以使用:

SELECT * 
FROM Iss_rec 
WHERE Fine IN (SELECT MAX(Fine) FROM Iss_rec);

答案 1 :(得分:0)

  

我需要使用用户打印具有最大罚款的记录   定义的功能。

您可以使用sys_refcursor打印值:

表:

CREATE TABLE FINE
(
  COL1  NUMBER,
  COL2  DATE,
  COL3  NUMBER,
  COL4  NUMBER,
  COL5  NUMBER
)

功能:

CREATE OR REPLACE FUNCTION maxf
   RETURN sys_refcursor
IS
   total  sys_refcursor;
BEGIN
   Open total for  
   SELECT * 
        FROM fine  
    WHERE col5 IN (SELECT MAX(col5) FROM fine);
   RETURN total;
END;
/

执行

DECLARE
   var   fine%ROWTYPE;
   x     SYS_REFCURSOR;
BEGIN
   x := maxf ();

   LOOP
      FETCH x INTO var;

      DBMS_OUTPUT.put_line (
         var.col1 ||' '|| var.col2 ||' '||  var.col3 || ' '|| var.col4 ||' '||  var.col5);

      EXIT WHEN x%NOTFOUND;
   END LOOP;
END;

输出:

SQL> /
165 12-APR-14 15677 978453 50
166 18-JUN-14 15678 978454 50


PL/SQL procedure successfully completed.

OR

SQL> Select maxf from dual;

MAXF
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

      COL1 COL2            COL3       COL4       COL5
---------- --------- ---------- ---------- ----------
       165 12-APR-14      15677     978453         50
       166 18-JUN-14      15678     978454         50