2016-08-04 8 views
-1

助けを求めるので、ここで私は、私はPL/SQLには本当に新しいですし、それはちょっと混乱を取得、すでに存在しています。 リストがある場合、それらのリスト項目がテーブルにまだ存在しない場合は、テーブルに挿入する必要があります。また、私はそれを行うには多くの方法がありますPL/SQLの挿入リスト項目は

DECLARE 
List VARCHAR; 
List := ('type', 'type2', 'type3'); 
BEGIN 
INSERT INTO types (code, type, sth) 
VALUES (1023, &list NOT IN types.type, 0); 
END; 
+0

?あなたの宣言は有効ではありません - varcharはサイズを持たなければならず、複数の値を保持することはできません。したがって、実際にコレクション型を持っていますか? PL/SQLコレクションかスキーマ・レベルで定義されているコレクションなので、プレーンSQLで使用できますか? –

+0

私はPL/SQLの構文と構造について、これに近づく前にもっと学びたいと思っています。スカラー変数に格納された単一の値の挿入を開始し、リストのすべての値を挿入しようとします(データ構造とその初期化と使用方法のドキュメントを確認してください)。これは、私はマージを探していることをお勧めします)。 – Aleksej

+0

SQLが実際のクエリではないため、私の宣言は無効です。私は本当にどのように質問を構築すべきか分かりません。リストはFORMを介してユーザによって入力されます。私はちょうどそれらの値をデータベースに挿入する必要がありますが、リストに最大138の値がある可能性があるので、1を1ずつしたくありません。 – mafioso

答えて

0

(.... tablefortypes.type ===タイプ、TYPE2、など) からタイプを取得するためのテーブルを持っています。最も簡単なのは、レコード内の特定のフィールドをユニークと定義することで、すでに存在する値を挿入しようとすると失敗します。その後、すべての値をループして、ループ内で挿入しようとして失敗する条件を処理できます。何かのような(疑似コード):

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 ; 

正確な構文の詳細をお伝えします。

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を(必要はありません。

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 
); 

それとも、同じ効果を持つことになり、そして再び、これは普通のSQLとして、あるいは内で使用することができ、a merge statementを使用することができます:あなたは)その制限を持っている、あなたは、プレーンなSQLに非常によく似たことを行うことができますPL/SQLブロックもしあなた本当にDに:

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()のみスキーマ・レベルのタイプで動作することです。

0

それとも完全性について:あなたのリストから来ている

create table demo (code integer, type varchar2(10) constraint demo_uk unique, sth integer); 

declare 
    list sys.odcivarchar2list; 
begin 
    list := sys.odcivarchar2list('type', 'type2', 'type3'); 

    insert /*+ ignore_row_on_dupkey_index(demo(type)) */ into demo (code, type, sth) 
    select 1023, l.column_value, 0 
    from table(list) l; 
end; 
関連する問題