リストのデータ型は重要です。特に、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()
のみスキーマ・レベルのタイプで動作することです。
?あなたの宣言は有効ではありません - varcharはサイズを持たなければならず、複数の値を保持することはできません。したがって、実際にコレクション型を持っていますか? PL/SQLコレクションかスキーマ・レベルで定義されているコレクションなので、プレーンSQLで使用できますか? –
私はPL/SQLの構文と構造について、これに近づく前にもっと学びたいと思っています。スカラー変数に格納された単一の値の挿入を開始し、リストのすべての値を挿入しようとします(データ構造とその初期化と使用方法のドキュメントを確認してください)。これは、私はマージを探していることをお勧めします)。 – Aleksej
SQLが実際のクエリではないため、私の宣言は無効です。私は本当にどのように質問を構築すべきか分かりません。リストはFORMを介してユーザによって入力されます。私はちょうどそれらの値をデータベースに挿入する必要がありますが、リストに最大138の値がある可能性があるので、1を1ずつしたくありません。 – mafioso