【问题标题】:PL/SQL Displaying multiple records using functionPL/SQL 使用函数显示多条记录
【发布时间】:2017-10-11 08:23:14
【问题描述】:

我有一个表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;
/

【问题讨论】:

  • 添加一些示例数据和预期结果,使其更易于跟踪
  • 打印记录?在 PL/SQL 中,您可以遍历数据并通过dbms_output.put_line 输出。如果您希望该函数改为返回行,您可以创建一个流水线函数并使用select * from table(myfunction) 查询它。
  • 如果您尝试过某事或期望从 SO 获得工作代码,您有什么要分享的吗?
  • @dbajtr 添加了一些示例数据
  • @XING 添加了我想出的东西...但它不起作用...至少对于多行...

标签: sql plsql oracle11g


【解决方案1】:

我需要使用用户打印具有最高罚款的记录 定义函数。

您可以使用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.

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

【讨论】:

    【解决方案2】:

    如果您只想选择可以使用的最大罚款的行:

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

    【讨论】:

    • 我想使用用户定义的函数来做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2017-03-31
    • 2010-12-22
    相关资源
    最近更新 更多