我是PL / SQL的新手,有点令人困惑,所以我在这里寻求帮助。 给定一个列表,我需要将这些列表项插入到表中,如果它们尚不存在的话。我还有一个表来获取类型 (tablefortypes.type === type,type2等....)
DECLARE
List VARCHAR;
List := ('type', 'type2', 'type3');
BEGIN
INSERT INTO types (code, type, sth)
VALUES (1023, &list NOT IN types.type, 0);
END;
答案 0 :(得分:1)
列表的数据类型很重要,特别是它是定义为PL / SQL类型(只能在PL / SQL中使用)还是在模式级别(可以在PL / SQL或纯SQL中使用) )。
这使用a built-in collection type,并使用不存在检查来查看插入的值是否已存在:
declare
list sys.odcivarchar2list;
begin
list := sys.odcivarchar2list('type', 'type2', 'type3');
insert into types (code, type, sth)
select 1023, l.column_value, 0
from table(list) l
where not exists (
select null from types t where t.type = l.column_value
);
end;
/
你不需要PL / SQL(尽管你对Forms的引用可能确实你有这个限制),你可以在普通的SQL中做一个非常类似的事情:
insert into types (code, type, sth)
select 1023, l.column_value, 0
from table(sys.odcivarchar2list('type', 'type2', 'type3')) l
where not exists (
select null from types t where t.type = l.column_value
);
或者您可以使用具有相同效果的a merge
statement,如果您确实需要,可以将其用作普通SQL或PL / SQL块:
merge into types t
using (select column_value from table(sys.odcivarchar2list('type', 'type2', 'type3'))) l
on (l.column_value = t.type)
when not matched then
insert (code, type, sth) values (1023, l.column_value, 0);
需要注意的重要一点是,table collection expression table()
仅适用于架构级类型。
答案 1 :(得分:0)
有很多方法可以做到这一点。最简单的方法是将记录中的特定字段定义为唯一,因此任何插入已存在的值的尝试都将失败。然后,您可以循环遍历所有值,并在循环内处理尝试插入失败的情况。像(伪代码):
LOOP
BEGIN
INSERT INTO tablename (field1 , field2 , field3)
VALUES (value1 , value2 , value3) ;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
-- Do nothing and continue in loop...
NULL ;
END ;
END LOOP ;
我为您留下确切语法的详细信息。
答案 2 :(得分:0)
或仅仅是为了完整性:
ui.warn()