PL/SQL - 精确提取返回超过请求的行数

Posted

技术标签:

【中文标题】PL/SQL - 精确提取返回超过请求的行数【英文标题】:PL/SQL - Exact fetch returns more than requested number of rows 【发布时间】: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;

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于PL/SQL - 精确提取返回超过请求的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle PL/SQL 中处理“超过请求的行数”

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)

WHILE循环出错:ORA-01422:精确提取返回的请求行数多于请求的行数

“精确提取返回的行数超过了请求的行数”

当我已经使用游标时,为啥我得到“精确提取返回的行数超过请求的行数”?

尝试从两列中提取多条记录时,精确提取返回的行数超过了请求的行数