1

都市名を挿入する(そして次のIDも作成する)手順があります。名前が既に存在する場合、都市名をテーブルに挿入しないようにするにはどうすればよいですか? ありがとう!私のコードがあります:

create or replace 
PROCEDURE PlaceName(
          town IN City.Name%TYPE)
AS
  id_C City.Id_City%TYPE;
BEGIN
  SELECT NVL(Max(c.Id_City)+1,1) INTO id_C
  FROM City c;
  INSERT INTO City
  VALUES(id_C, town);
End;
4

4 に答える 4

4

私は、テーブルに制約が必要であるというベンの意見に同意しUNIQUEます (それが有効な制約であると仮定します) MERGE

MERGE INTO city c
USING ( SELECT 1 FROM dual )
   ON c.name = town
 WHEN NOT MATCHED THEN INSERT ( id, name )
      VALUES ( my_sequence.NEXTVAL, town );

このUSING句はここでは実際には必要ありませんが、merge ステートメントでは必須です。

于 2013-01-20T23:29:14.260 に答える
2

いいえ、存在しない場合にのみ挿入しないでください。これには2つの操作が必要です。それが存在するかどうかを確認してから、レコードを挿入する必要があります。

これに対する正しい方法は、テーブルに一意の制約を作成することです。ドキュメントに記載されているようにこれをインラインで行うことができます。または、テーブルがすでに存在する場合は、それを変更して制約を追加できます。

ALTER TABLE table_name
add CONSTRAINT constraint_name UNIQUE (city);

次に、既存の都市を挿入するときに発生した例外をキャッチし、取得した情報を使用して必要な操作を行います。

また、IDを誤ってインクリメントしています。SEQUENCEを使用する必要があります。これにより、別のSELECTが節約されます。

CREATE SEQUENCE city_seq
     START WITH <current max ID>
   INCREMENT BY 1;

その後、手順は次のようになります。

create or replace procedure PlaceName (
          town in city.name%type ) is

begin
  insert into city
  values(city_seq.nextval, town);

-- Catch the raised exception if the city already exists.
exception when dup_val_on_index then
   <do something>;
end;
于 2013-01-20T22:45:32.657 に答える
0
insert into City
  select seq.nextval, town
from dual where not exists (select 1 from City where name = town);

人工キーにはシーケンスを使用することを強くお勧めします。「selectnvl(max())」は非常に悪いです。説明が必要な場合は、私に聞いてください:)

于 2013-01-21T07:04:21.890 に答える
0

Oracle MERGE コマンドを検索します。

于 2013-01-20T22:35:08.943 に答える