PL/SQL: ORA-00947: 值不足
PL/SQL: ORA-00947: not enough values
我正在创建一个程序来显示员工的 n 个最高和最低工资。如果我将 5 作为输入,查询将为我提供 5 个员工的最高和最低工资。
对于上述场景,我创建了一个包含两列的对象,如下所示
create type vrec as object(
empno number,
sal number
);
/
然后我在对象类型的帮助下创建了嵌套 table,这样我就可以使用嵌套 table 作为 out 参数到 return 所有行。
create type vrec_type is table of vrec;
/
创建数据类型后,我正在创建一个如下所示的过程
create or replace procedure pro_first_last(input in number,salary out vrec_type)
is
begin
select empno,sal BULK COLLECT INTO salary from (
select empno,sal from
(select empno,sal,rank() over(order by sal asc) min_sal from emp5 where sal is not null) where min_sal <= 5
union all
select empno,sal from
(select empno,sal,rank() over(order by sal desc) max_sal from emp5 where sal is not null) where max_sal <= 5);
for i in salary.first..salary.last
loop
dbms_output.put_line(salary(i).empno);
end loop;
end;
/
当我编译上述程序时,我得到的值不够。我还创建了具有两列的对象,并且在 select 语句中我也只 returning 了两列。有人可以审查并帮助我解决这个问题或提供一些替代解决方案。
您是直接将empno, sal
值添加到salary
(vrec_type
对象,它只能取对象类型vrec
的值)
您需要创建 vrec
的 object
,然后将其添加到 salary
中,如下所示:
create or replace procedure pro_first_last(input in number,salary out vrec_type)
is
begin
select vrec(empno,sal) -- change in this line
BULK COLLECT INTO salary from (
select empno,sal from
(select empno,sal,rank() over(order by sal asc) min_sal from emp5 where sal is not null) where min_sal <= 5
union all
select empno,sal from
(select empno,sal,rank() over(order by sal desc) max_sal from emp5 where sal is not null) where max_sal <= 5);
for i in salary.first..salary.last
loop
dbms_output.put_line(salary(i).empno);
end loop;
end;
干杯!!
我正在创建一个程序来显示员工的 n 个最高和最低工资。如果我将 5 作为输入,查询将为我提供 5 个员工的最高和最低工资。
对于上述场景,我创建了一个包含两列的对象,如下所示
create type vrec as object(
empno number,
sal number
);
/
然后我在对象类型的帮助下创建了嵌套 table,这样我就可以使用嵌套 table 作为 out 参数到 return 所有行。
create type vrec_type is table of vrec;
/
创建数据类型后,我正在创建一个如下所示的过程
create or replace procedure pro_first_last(input in number,salary out vrec_type)
is
begin
select empno,sal BULK COLLECT INTO salary from (
select empno,sal from
(select empno,sal,rank() over(order by sal asc) min_sal from emp5 where sal is not null) where min_sal <= 5
union all
select empno,sal from
(select empno,sal,rank() over(order by sal desc) max_sal from emp5 where sal is not null) where max_sal <= 5);
for i in salary.first..salary.last
loop
dbms_output.put_line(salary(i).empno);
end loop;
end;
/
当我编译上述程序时,我得到的值不够。我还创建了具有两列的对象,并且在 select 语句中我也只 returning 了两列。有人可以审查并帮助我解决这个问题或提供一些替代解决方案。
您是直接将empno, sal
值添加到salary
(vrec_type
对象,它只能取对象类型vrec
的值)
您需要创建 vrec
的 object
,然后将其添加到 salary
中,如下所示:
create or replace procedure pro_first_last(input in number,salary out vrec_type)
is
begin
select vrec(empno,sal) -- change in this line
BULK COLLECT INTO salary from (
select empno,sal from
(select empno,sal,rank() over(order by sal asc) min_sal from emp5 where sal is not null) where min_sal <= 5
union all
select empno,sal from
(select empno,sal,rank() over(order by sal desc) max_sal from emp5 where sal is not null) where max_sal <= 5);
for i in salary.first..salary.last
loop
dbms_output.put_line(salary(i).empno);
end loop;
end;
干杯!!