DECLARE v_ejob employee.e_job%type; BEGIN SELECT e_job INTO v_ejob FROM employee WHERE e_job = ( SELECT e_job FROM ( SELECT * FROM employee ORDER BY hiredate DESC ) WHERE rownum < 2 ); dbms_output.put_line('资格最老的职员为:'||v_ejob); END; 输出时显示实际行数超出请求的行数
时间: 2023-06-19 10:04:47 浏览: 82
这个错误通常会出现在你查询结果集的时候,实际的行数超过了你查询时指定的行数。在这个例子中,可能是因为你的子查询语句中使用了ORDER BY,这会导致结果集的实际行数超过了1行,而你的子查询中只查询了前1行。
你可以尝试使用RANK或DENSE_RANK函数来查询第2老的职员,而不是使用子查询。例如:
```
DECLARE
v_ejob employee.e_job%type;
BEGIN
SELECT e_job
INTO v_ejob
FROM (
SELECT e_job, DENSE_RANK() OVER (ORDER BY hiredate DESC) AS rnk
FROM employee
)
WHERE rnk = 2;
dbms_output.put_line('资格第二老的职员为:'||v_ejob);
END;
```
这个查询会使用DENSE_RANK函数来为每一个职员计算一个排名,然后在外层查询中选择排名为2的职员。注意,这个查询中不需要使用子查询,因为我们可以在内部查询中直接使用ORDER BY来排序。
相关问题
declare v_ejob employee.e_job%type; begin select e_job into v_ejob from employee where e_job=( select e_job from (select * from employee order by hiredate desc) where rownum <2); dbms_output.put_line('资格最老的职员为:'||v_ejob); end;改错
你提供的 PL/SQL 代码存在一些语法错误,下面是已经修正的代码:
```
DECLARE
v_ejob employee.e_job%type;
BEGIN
SELECT e_job
INTO v_ejob
FROM employee
WHERE e_job = (
SELECT e_job
FROM (
SELECT *
FROM employee
ORDER BY hiredate DESC
)
WHERE rownum < 2
);
dbms_output.put_line('资格最老的职员为:'||v_ejob);
END;
```
修正的内容包括:
1. `DECLARE` 与 `BEGIN` 之间需要一个空格。
2. 在 `SELECT` 语句中,需要给内层的子查询一个别名。
3. `dbms_output.put_line()` 函数的括号中需要使用单引号括起来的字符串。
阅读全文