【问题标题】:how to insert value in nested table through plsql block如何通过plsql块在嵌套表中插入值
【发布时间】:2016-10-23 18:41:58
【问题描述】:

我已经创建了代码

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块在嵌套表中插入值

【问题讨论】:

  • 我正在尝试在 petcare 嵌套表中插入新值
  • 我正在尝试在嵌套表中插入值

标签: plsql oracle11g nested-table


【解决方案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                   

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多