如果PL / SQL列表项已经不存在,则将它们列入表中

时间:2016-08-04 07:38:03

标签: oracle plsql

我是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;

3 个答案:

答案 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()