2016-06-22 6 views
0

У меня есть следующий PL/SQL-блок для получения записей из типа записи, и я использую объект записи как array.It дает неправильное число или типы аргумента error где я инициализирую array.kindly дать мне письменное решение для инициализации объекта записи как массив.Как инициализировать объект записи как массив в plsql?

DECLARE 
TYPE loc IS RECORD (
loc_id number(4), 
str_add VARCHAR2(40), 
p_code VARCHAR2(12), 
city  VARCHAR2(30), 
st_pro VARCHAR2(25), 
c_id  CHAR(2),    
Oper varchar2(1)); 


--names namesarray; 
--loc_rec loc IS VARRAY(8); 
type loc_rec IS VARRAY(8) OF loc; 

total number(4); 
tot number(3); 
loc_id1 number(4); 
i number(2); 


begin 

i:=1; 
loc_rec(1).loc_id:=1; 
loc_rec(1).str_add:='chikhli'; 
loc_rec(1).p_code:='396521'; 
loc_rec(1).city:='chikhli'; 
loc_rec(1).st_pro:='Gujarat'; 
loc_rec(1).c_id:='G1'; 
loc_rec(1).Oper:='I'; 

loc_rec(2).loc_id:=2; 
loc_rec(2).str_add:='chikhli'; 
loc_rec(2).p_code:='396521'; 
loc_rec(2).city:='chikhli'; 
loc_rec(2).st_pro:='Gujarat'; 
loc_rec(2).c_id:='G1'; 
loc_rec(2).Oper:='U'; 


loc_rec(3).loc_id:=3; 
loc_rec(3).str_add:='chikhli'; 
loc_rec(3).p_code:='396521'; 
loc_rec(3).city:='chikhli'; 
loc_rec(3).st_pro:='Gujarat'; 
loc_rec(3).c_id:='G1'; 
loc_rec(3).Oper:='D'; 


--names := --namesarray(loc_rec.loc_id,loc_rec.str_add,loc_rec.p_code, 
--loc_rec.city,loc_rec.st_pro,loc_rec.c_id,loc_rec.Oper); 

LOOP 

--total := names.count; 

if loc_rec(i).Oper='I' then 

insert into locations values(loc_rec(i).loc_id, 
loc_rec(i).str_add, 
loc_rec(i).p_code, 
loc_rec(i).city, 
loc_rec(i).st_pro, 
loc_rec(i).c_id 
); 

dbms_output.put_line('Record Inserted Successfully'); 

elsif loc_rec(i).Oper='D' then 

delete from locations where location_id=loc_rec(i).loc_id; 
dbms_output.put_line('Record deleted Successfully'); 

if(sql%NOTFOUND) then 
dbms_output.put_line('Input location ID Not Found'); 
end if; 

elsif loc_rec(i).Oper='U' then 


update locations 
set 
street_address=loc_rec(i).str_add, 
postal_code=loc_rec(i).p_code, 
city=loc_rec(i).city, 
state_province=loc_rec(i).st_pro, 
country_id=loc_rec(i).c_id 
where location_id=loc_rec(i).loc_id; 

dbms_outt.put_line('Record Updated Successfully'); 

if(sql%NOTFOUND) then 

insert into locations values(loc_rec(i).loc_id, 
loc_rec(i).str_add, 
loc_rec(i).p_code, 
loc_rec(i).city, 
loc_rec(i).st_pro, 
loc_rec(i).c_id 
); 

end if; 


else 
dbms_output.put_line('Kindly give proper Input: I:insert U:update D:delete'); 
end if; 

commit; 
i:=i+1; 
END LOOP; 
end; 
/
+1

, какая линия являются у gewtting ошибки? – Avi

+0

строка номер 21, где я написал loc_rec (1) .loc_id: = 1; –

ответ

0

В коде есть несколько ошибок.

  1. Вы не объявили переменные для хранения вашего массива
  2. Вы не инициализированы коллекции
  3. Вы не продлили коллекцию провести новую строку
  4. dbms_outt.put_line ... опечатка ; Я думаю, что вы имеете в виду dbms_output.put_line
  5. Вы неправильно перебираете коллекцию - вы более или менее закодировали бесконечный цикл, за исключением того, что в конечном итоге у вас не будет элементов в вашей коллекции, и в итоге вы получите индекс из в конечном итоге.

Ваш код должен быть что-то вроде:

declare 
    type loc is record (loc_id number (4), 
         str_add varchar2 (40), 
         p_code varchar2 (12), 
         city varchar2 (30), 
         st_pro varchar2 (25), 
         c_id char (2), 
         oper varchar2 (1)); 


    --names namesarray; 
    --loc_rec loc IS VARRAY(8); 
    type loc_varray is varray (8) of loc; 

    total number (4); 
    tot number (3); 
    loc_id1 number (4); 
    loc_rec loc_varray := loc_varray(); 
begin 
    loc_rec.extend; 
    loc_rec (1).loc_id := 1; 
    loc_rec (1).str_add := 'chikhli'; 
    loc_rec (1).p_code := '396521'; 
    loc_rec (1).city := 'chikhli'; 
    loc_rec (1).st_pro := 'Gujarat'; 
    loc_rec (1).c_id := 'G1'; 
    loc_rec (1).oper := 'I'; 

    loc_rec.extend; 
    loc_rec (2).loc_id := 2; 
    loc_rec (2).str_add := 'chikhli'; 
    loc_rec (2).p_code := '396521'; 
    loc_rec (2).city := 'chikhli'; 
    loc_rec (2).st_pro := 'Gujarat'; 
    loc_rec (2).c_id := 'G1'; 
    loc_rec (2).oper := 'U'; 

    loc_rec.extend; 
    loc_rec (3).loc_id := 3; 
    loc_rec (3).str_add := 'chikhli'; 
    loc_rec (3).p_code := '396521'; 
    loc_rec (3).city := 'chikhli'; 
    loc_rec (3).st_pro := 'Gujarat'; 
    loc_rec (3).c_id := 'G1'; 
    loc_rec (3).oper := 'D'; 


    --names := --namesarray(loc_rec.loc_id,loc_rec.str_add,loc_rec.p_code, 
    --loc_rec.city,loc_rec.st_pro,loc_rec.c_id,loc_rec.Oper); 

    for i in loc_rec.first..loc_rec.last 
    loop 
    --total := names.count; 

    if loc_rec (i).oper = 'I' 
    then 
     insert Into Locations 
     Values  (Loc_Rec (I).Loc_Id, 
        Loc_Rec (I).Str_Add, 
        Loc_Rec (I).P_Code, 
        Loc_Rec (I).City, 
        Loc_Rec (I).St_Pro, 
        Loc_Rec (I).C_Id); 

     dbms_output.put_line ('Record Inserted Successfully'); 
    elsif loc_rec (i).oper = 'D' 
    then 
     delete from locations 
     where  location_id = loc_rec (i).loc_id; 

     dbms_output.put_line ('Record deleted Successfully'); 

     if (sql%notfound) 
     then 
     dbms_output.put_line ('Input location ID Not Found'); 
     end if; 
    elsif loc_rec (i).oper = 'U' 
    then 
     UPDATE locations 
     SET street_address = loc_rec (i).str_add, 
      postal_code = loc_rec (i).p_code, 
      city = loc_rec (i).city, 
      state_province = loc_rec (i).st_pro, 
      country_id = loc_rec (i).c_id 
     WHERE location_id = loc_rec (i).loc_id; 

     dbms_output.put_line ('Record Updated Successfully'); 

     if (sql%notfound) 
     then 
     insert into locations 
     values  (loc_rec (i).loc_id, 
        loc_rec (i).str_add, 
        loc_rec (i).p_code, 
        loc_rec (i).city, 
        loc_rec (i).st_pro, 
        loc_rec (i).c_id); 
     end if; 
    else 
     dbms_output.put_line (
     'Kindly give proper Input: I:insert U:update D:delete'); 
    end if; 

    commit; 
    end loop; 
end; 
/
+0

Спасибо ..................................... –