如何通过 plsql 块在嵌套 table 中插入值
how to insert value in nested table through plsql block
我已经创建了代码
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: inconsistent datatypes:
如何通过 plsql 块
在嵌套 table 中插入值
您得到的完整错误是:
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
这很清楚你做错了什么。您正在尝试将新的嵌套 table(包含一个元素)插入现有的嵌套 table。您只需直接插入新对象即可:
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
我已经创建了代码
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: inconsistent datatypes:
如何通过 plsql 块
在嵌套 table 中插入值您得到的完整错误是:
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
这很清楚你做错了什么。您正在尝试将新的嵌套 table(包含一个元素)插入现有的嵌套 table。您只需直接插入新对象即可:
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