【问题标题】:PL/SQL - Exact fetch returns more than requested number of rowsPL/SQL - 精确提取返回超过请求的行数
【发布时间】:2016-01-18 09:48:02
【问题描述】:

我正在尝试创建函数,该函数将返回部门内每个工作的最高薪水消息,并按最高薪水排序。

消息需要是:

部门:部门名称,

职位/职位:职位名称,最高工资:工资金额,

create or replace PACKAGE BODY Salary AS

FUNCTION max_sal(DEPTNO_F NUMBER)
RETURN VARCHAR2 IS  
dept_name VARCHAR2(25); 
job_possition VARCHAR(25);
maximum_salary NUMBER;
message VARCHAR2(255);

BEGIN



SELECT DNAME, JOB, MAX(SAL) AS "SAL" 
INTO  job_possition, maximum_salary
FROM EMP
WHERE DEPTNO = DEPTNO_F
GROUP BY JOB, DNAME
ORDER BY SAL DESC;


message := 'Department name: '||dept_name|| 'Job positin: '   ||job_possitin||, 'Maximum Salary: ' ||maximum_salary;

return message;



END max_sal;

END Salary;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    问题是您的查询返回的不是一行,它无法选择您的 2 个变量。您是否尝试过在包外运行 SELECT SQL 语句并检查您返回的行?

    对于任何给定的DEPTNO_F 值,DNAMEJOB 的排列不应超过一个

    【讨论】:

      【解决方案2】:

      要处理查询结果中的多行,您必须使用循环:

      create or replace PACKAGE BODY Salary AS
      
      FUNCTION max_sal(DEPTNO_F NUMBER)
      RETURN VARCHAR2 IS  
      dept_name VARCHAR2(25); 
      job_possition VARCHAR(25);
      maximum_salary NUMBER;
      message VARCHAR2(255);
      
      BEGIN
      
      
      for i in (SELECT DNAME, JOB, MAX(SAL) SAL 
                  FROM EMP
                 WHERE DEPTNO = DEPTNO_F
                 GROUP BY JOB, DNAME
                 ORDER BY SAL DESC) loop
      
        message := message || 'Department name: ' || i.DNAME || ', Job position: ' ||
                   i.JOB || ', Maximum Salary: ' || i.SAL || chr(10);
      
      end loop;
      return message;
      
      END max_sal;
      
      END Salary;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2014-02-11
        相关资源
        最近更新 更多