PL / SQL: ORA-00947: недостаточно значений - PullRequest
0 голосов
/ 25 сентября 2019

Я создаю процедуру для отображения n номера максимальной и минимальной зарплаты для сотрудника.Если я введу 5 в качестве входных данных, запрос получит 5 максимальных и минимальных зарплат для сотрудника.

Для описанного выше сценария я создал объект с двумя столбцами, как показано ниже

create type vrec as object(
empno number,
sal number
);
/

Затем я создал вложенную таблицу с помощью типа объекта, чтобы я мог использовать вложенную таблицув качестве параметра out для возврата всех строк за одно короткое время.

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;
/

Когда я компилирую вышеуказанную процедуру, яполучать недостаточно ценностей.Я также создал объект с двумя столбцами и в операторе выбора также я возвращаю только два столбца.Может ли кто-нибудь рассмотреть и помочь мне в этом или предложить какое-нибудь альтернативное решение.

1 Ответ

1 голос
/ 25 сентября 2019

Вы напрямую добавляете empno, sal значения в salary (vrec_type объект, который может принимать значения только для типа объекта vrec)

Вам необходимо создать object из vrec и затем добавьте его в 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;

Cheers !!

...