Oracle
 sql >> база данни >  >> RDS >> Oracle

грешен номер или типове аргументи при извикване на P_AA

Вашата процедура дефинира параметъра по следния начин:

serv in t45

Така че t45 е дефинираният тип данни на параметъра.

Сега, когато извиквате процедурата, предавате променлива v . И как е v дефиниран?

type t1 is table of number;
...
v t1;

t1 е различен тип от t45 . Дори и да имат идентични структури те са различни видове . И затова получавате PLS-00306. Решението е съвсем просто:дефинирайте v като t45 .

Трябва да инициализирате колекцията. Вие правите това, като използвате конструктора по подразбиране на типа, или в началото на програмата ...

v := t45();

... или когато го декларирате:

v t45 := t45();

След като стигнете отвъд това, ще откриете, че логиката ви на присвояване е грешна:извличате в елемент от колекцията, преди да увеличите брояча или да разширите масива. И така, това, от което се нуждаете, е следното:

declare
  cursor c1 is select serv_item_id from serv_item;
    n number:=0;
    v t45 := t45();
    x number;
begin
  open c1;
  loop
    fetch c1 into x;
    exit when c1%notfound;
    n:=n+1;
    v.extend();
    v(n) := x;
  end loop;
  close c1;
  p_aa(v);
end;
/ 

Като алтернатива използвайте по-малко многословното групово събиране, което управлява имплицитно всички цикли и управление на типове:

declare
    v t45;
begin
  select serv_item_id 
  bulk collect into v
  from serv_item;
  p_aa(v);
end;
/

Ето db<>демонстрация на fiddle показващи работещи и двата подхода.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте числа в думи в индийската система за номериране

  2. Прецизност на интервала за стойността на PL/SQL функция

  3. Oracle по-бърза проверка на припокриване

  4. saveOrUpdate на Hibernate игнорира свойството на ненулева колона

  5. Как да изберете Топ 100 реда в Oracle?