Oracle 过程-仅当不存在时插入
我有一个插入城市名称并创建下一个id的过程。如果名称已经存在,如何不让插入城市名称到表中?谢谢 这是我的代码:Oracle 过程-仅当不存在时插入,oracle,plsql,Oracle,Plsql,我有一个插入城市名称并创建下一个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
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;
查找Oracle合并命令。查找Oracle合并命令。否,仅当Oracle合并命令不存在时才插入。这需要两个操作。您必须检查它是否存在,然后插入记录 正确的方法是在表上创建一个。您可以按照文档中的说明进行内联操作,或者如果您的表已经存在,您可以修改它以添加约束:
ALTER TABLE table_name
add CONSTRAINT constraint_name UNIQUE (city);
然后,您将捕获插入已存在的城市时引发的异常,然后根据所获得的信息执行任何操作
您还错误地增加了您的ID。您应该使用,这将为您保存另一个选择
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;
不,仅当它不存在时才插入。这需要两个操作。您必须检查它是否存在,然后插入记录 正确的方法是在表上创建一个。您可以按照文档中的说明进行内联操作,或者如果您的表已经存在,您可以修改它以添加约束:
ALTER TABLE table_name
add CONSTRAINT constraint_name UNIQUE (city);
然后,您将捕获插入已存在的城市时引发的异常,然后根据所获得的信息执行任何操作
您还错误地增加了您的ID。您应该使用,这将为您保存另一个选择
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;
我同意Ben的观点,表上应该有一个唯一的约束,假设这是一个有效的约束,但是使用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语句是必需的。我同意Ben的观点,即表上应该有一个唯一的约束,假设这是一个有效的约束,但使用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 );
insert into City
select seq.nextval, town
from dual where not exists (select 1 from City where name = town);
这里实际上不需要USING子句,但对于merge语句它是必需的
insert into City
select seq.nextval, town
from dual where not exists (select 1 from City where name = town);
我严格建议对人工关键点使用序列。
选择nvlmax非常非常糟糕。
如果您需要解释,请询问我:
我严格建议对人工关键点使用序列。
选择nvlmax非常非常糟糕。
如果您需要解释,请询问我: