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
值,DNAME
和 JOB
的排列不应超过一个
【讨论】:
【参考方案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:精确提取返回的请求行数多于请求的行数