Ошибка в строке 28: PLS-00306: неправильное количество или типы аргументов при вызове ошибки O_ITEM_TKT_REC_TAB

#oracle #plsql

Вопрос:

Я создал входящие и исходящие объекты, как показано ниже

 create or replace TYPE O_item_tkt_tab AS OBJECT 
(
item    varchar2(25),
ticket_type_id varchar2(4),
Msg_type varchar2(50));

create or replace TYPE O_item_tkt_rec_tab
AS TABLE OF O_item_tkt_tab;
 
 create or replace TYPE I_item_tkt_tab AS OBJECT (
  item varchar2(25), 
  item_Action varchar2(50), 
  ticket_type_id varchar2(4), 
  ticket_type_id_action varchar2(50),
  count number(5,0)
);

create or replace TYPE I_item_tkt_rec_tab AS TABLE OF I_item_tkt_tab;
 

и создал процедуру, как показано ниже

 CREATE OR REPLACE PROCEDURE item_tkt_tab(
    In_Item_tab      IN     I_item_tkt_rec_tab ,                                           
    Out_Item_tab     OUT    O_item_tkt_rec_tab  
                                         )
IS
    L_Tkt_stat varchar2(10);    
    L_Item  varchar2(25);
    L_ticket_type_id varchar2(4);

    CURSOR c_get_tkt_tab(L_Item varchar2,L_ticket_type_id varchar2)
    IS
        SELECT 1 from item_ticket
        where item =L_Item
        and ticket_type_id = L_ticket_type_id;

BEGIN

    Out_Item_tab := O_item_tkt_rec_tab();

    FOR i IN 1 .. In_Item_tab.COUNT
    LOOP
        open c_get_tkt_tab(In_Item_tab(i).Item,In_Item_tab(i).ticket_type_id);
        FETCH c_get_tkt_tab into L_Tkt_stat;
        CLOSE c_get_tkt_tab;

        if L_Tkt_stat is not null
        then
            Out_Item_tab := O_item_tkt_rec_tab(In_Item_tab(i).item,In_Item_tab(i).ticket_type_id,'XItemTicketCre') ;
        else
            Out_Item_tab := O_item_tkt_rec_tab(In_Item_tab(i).item,In_Item_tab(i).ticket_type_id,'XItemTicketMod') ;
        end if;
    END LOOP;

EXCEPTION
    WHEN OTHERS
    THEN
        Out_Item_tab := NULL;   
END;
 

но получаю сообщение об ошибке

 Error at line 28: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 28: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 28: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 30: PL/SQL: Statement ignored
Error at line 30: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 30: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 30: PLS-00306: wrong number or types of arguments in call to 'O_ITEM_TKT_REC_TAB'
Error at line 28: PL/SQL: Statement ignored
 

пожалуйста, помогите мне решить эту проблему

Ответ №1:

o_item_tkt_rec_tab представляет собой набор o_item_tkt_tab , поэтому задание должно быть таким:

 if l_tkt_stat is not null then
    out_item_tab :=
        o_item_tkt_rec_tab(
            o_item_tkt_tab(in_item_tab(i).item, in_item_tab(i).ticket_type_id, 'XItemTicketCre' )
        );
else
    out_item_tab :=
        o_item_tkt_rec_tab(
            o_item_tkt_tab(in_item_tab(i).item, in_item_tab(i).ticket_type_id, 'XItemTicketMod')
        );
end if;
 

Обычно _tab в имени типа указывается коллекция (тип таблицы), поэтому немного сбивает с толку, что o_item_tkt_tab это тип объекта, а не коллекция.

Мне также не ясно, что i_ o_ означают префиксы и.

Комментарии:

1. Привет.. У меня есть еще один вопрос… в моем входном объекте я определил одну переменную ticket_type_id_action . Теперь я должен написать логику в приведенной ниже процедуре, если ticket_type_id_action-это изменение,затем обновление,, если нет изменений, то нет обновления. пожалуйста, помогите мне в этом

2. Звучит как новый вопрос 🙂