как вставить значение во вложенную таблицу через блок plsql

#plsql #oracle11g #nested-table

#plsql #oracle11g #вложенная таблица

Вопрос:

я создал код

 create type vet_visit_t is object 
(visit_date date,
reason varchar2(100)
);
create type vet_visit_list_t is table of 
vet_visit_t;
Create table  pet_table 
(
tag_no integer,
name varchar2 (60),
breed varchar2(100),
petcare vet_visit_list_t
);
insert into pet_table (tag_no,name,breed,petcare )
VALUES  (100,
           'mercury',
           'african grey parrot',
           vet_visit_list_t (vet_visit_t('01-JAN-2001','clip wing'),
                             vet_visit_t('01-apr-2002','check cholesterol'),
                             vet_visit_t('01-MAY-2002','check cholesterol')
                             )
           );
  

теперь я использую блок plsql для вставки в pet_table

 declare
pet_c vet_visit_list_t :=vet_visit_list_t();
pet_object vet_visit_t;
begin 
pet_object := vet_visit_t('03-feb-2004','eye checkup');
pet_c :=vet_visit_list_t(pet_object);
insert into table(select pet_table.petcare from pet_table where tag_no =100)
values (pet_c);
end;
/
  

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

PL/ SQL: ORA-00932: несовместимые типы данных:

как вставить значение во вложенную таблицу через блок plsql

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

1. я пытаюсь вставить новое значение во вложенную таблицу petcare

2. я пытаюсь вставить значение во вложенную таблицу

Ответ №1:

Полная ошибка, которую вы получаете, это:

 ORA-06550: line 8, column 9:
PL/SQL: ORA-00932: inconsistent datatypes: expected SCHEMA.VET_VISIT_LIST_T got SCHEMA.VET_VISIT_T
ORA-06550: line 7, column 1:
PL/SQL: SQL Statement ignored
  

Это довольно ясно показывает, что вы делаете неправильно. Вы пытаетесь вставить новую вложенную таблицу (с одним элементом) в существующую вложенную таблицу. Вам нужно просто вставить новый объект напрямую:

 declare
  pet_object vet_visit_t;
begin 
  pet_object := vet_visit_t(to_date('03-feb-2004','DD-MON-YYYY'),'eye checkup');
  insert into table(select pet_table.petcare from pet_table where tag_no =100)
  values (pet_object);
end;
/
  

Пожалуйста, обратите внимание также, что я использовал явное преобразование даты с to_date() ; вы передавали строку и полагались на неявное преобразование даты на основе ваших настроек NLS, что не очень хорошая идея, поскольку ваш код может вести себя по-другому в другом сеансе (другой клиент, кто-то другой, запускающий его, и т.д.).

Вы также можете выполнить вставку более просто:

 insert into table(select pet_table.petcare from pet_table where tag_no =100)
values (vet_visit_t(date '2004-02-03','eye checkup'));
  

что вы можете сделать в обычном SQL, без необходимости в блоке PL / SQL (хотя, конечно, это будет работать и внутри блока). На этот раз я также использовал литерал даты ANSI, который я предпочитаю для фиксированных дат.

В любом случае вы получаете:

 select pc.*
from pet_table pt
cross join table(pt.petcare) pc
where tag_no = 100;

VISIT_DATE REASON                        
---------- ------------------------------
2001-01-01 clip wing                     
2002-04-01 check cholesterol             
2002-05-01 check cholesterol             
2004-02-03 eye checkup