我有一個名為 TABLE1 的表,它有 2 列(NO,NAME)
CREATE TABLE TABLE1( NO NUMBER(3) NOT NULL, NAME VARCHAR2(5) NOT NULL);
CREATE UNIQUE INDEX TX ON TABLE1(NO,NAME);
我正在嘗試插入如下所述的值:
INSERT INTO TABLE1 VALUES(101, 'JOHN');
INSERT INTO TABLE1 VALUES(102, 'MORN');
INSERT INTO TABLE1 VALUES(103, 'TONY');
INSERT INTO TABLE1 VALUES(103, 'TONY');
INSERT INTO TABLE1 VALUES(103, 'RONY');
正如你在上面看到的,我已經兩次給出了一個插入陳述句。實際上,上面的插入陳述句作業正常,但是當它出現第四個插入陳述句時,它會拋出預期的錯誤。我正在尋找 INSERT INTO VALUES 陳述句,如果出現重復的插入陳述句,它應該跳過該特定的插入陳述句而不顯示錯誤并轉到下一個 INSERT 陳述句。
我嘗試使用以下陳述句,但它在 Oracle SQL 中不起作用
INSERT IGNORE INTO TABLE1 VALUES(101, 'JOHN');
INSERT IGNORE INTO TABLE1 VALUES(102, 'MORN');
INSERT IGNORE INTO TABLE1 VALUES(103, 'TONY');
INSERT IGNORE INTO TABLE1 VALUES(103, 'TONY');
INSERT IGNORE INTO TABLE1 VALUES(103, 'RONY');
uj5u.com熱心網友回復:
您可以使用錯誤日志并將錯誤重定向到:
begin
dbms_errlog.create_error_log (
dml_table_name => 'TABLE1'
);
end;
/
然后:
INSERT INTO TABLE1 VALUES(101, 'JOHN') LOG ERRORS REJECT LIMIT UNLIMITED;
INSERT INTO TABLE1 VALUES(102, 'MORN') LOG ERRORS REJECT LIMIT UNLIMITED;
INSERT INTO TABLE1 VALUES(103, 'TONY') LOG ERRORS REJECT LIMIT UNLIMITED;
INSERT INTO TABLE1 VALUES(103, 'TONY') LOG ERRORS REJECT LIMIT UNLIMITED;
INSERT INTO TABLE1 VALUES(103, 'RONY') LOG ERRORS REJECT LIMIT UNLIMITED;
然后:
SELECT * FROM table1;
輸出:
不 姓名 101 約翰 102 早晨 103 羅尼 103 托尼
和:
SELECT * FROM ERR$_TABLE1;
輸出:
ORA_ERR_NUMBER$ ORA_ERR_MESG$ ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ 不 姓名 1 ORA-00001: 違反了唯一約束 (FIDDLE_TAXEGGNAZTFZWUNUZXOL.TX)<br> 無效的 我 無效的 103 托尼
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以使用MERGE陳述句檢查現有行并僅插入新行:
MERGE INTO TABLE1 dst
USING (
SELECT 101 AS no, 'JOHN' AS name FROM DUAL
) src
ON (dst.no = src.no AND dst.name = src.name)
WHEN NOT MATCHED THEN
INSERT (no, name) VALUES (src.no, src.name);
MERGE INTO TABLE1 dst
USING (
SELECT 102 AS no, 'MORN' AS name FROM DUAL
) src
ON (dst.no = src.no AND dst.name = src.name)
WHEN NOT MATCHED THEN
INSERT (no, name) VALUES (src.no, src.name);
MERGE INTO TABLE1 dst
USING (
SELECT 103 AS no, 'TONY' AS name FROM DUAL
) src
ON (dst.no = src.no AND dst.name = src.name)
WHEN NOT MATCHED THEN
INSERT (no, name) VALUES (src.no, src.name);
MERGE INTO TABLE1 dst
USING (
SELECT 103 AS no, 'TONY' AS name FROM DUAL
) src
ON (dst.no = src.no AND dst.name = src.name)
WHEN NOT MATCHED THEN
INSERT (no, name) VALUES (src.no, src.name);
MERGE INTO TABLE1 dst
USING (
SELECT 103 AS no, 'RONY' AS name FROM DUAL
) src
ON (dst.no = src.no AND dst.name = src.name)
WHEN NOT MATCHED THEN
INSERT (no, name) VALUES (src.no, src.name);
然后:
SELECT * FROM table1;
輸出:
不 姓名 101 約翰 102 早晨 103 羅尼 103 托尼
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以將INSERT陳述句包裝在 PL/SQL 匿名塊中并捕獲DUP_VAL_ON_INDEX例外:
BEGIN
INSERT INTO TABLE1 VALUES(101, 'JOHN');
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
BEGIN
INSERT INTO TABLE1 VALUES(102, 'MORN');
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
BEGIN
INSERT INTO TABLE1 VALUES(103, 'TONY');
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
BEGIN
INSERT INTO TABLE1 VALUES(103, 'TONY');
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
BEGIN
INSERT INTO TABLE1 VALUES(103, 'RONY');
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
/
然后:
SELECT * FROM table1;
輸出:
不 姓名 101 約翰 102 早晨 103 羅尼 103 托尼
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以IGNORE_ROW_ON_DUPKEY_INDEX在陳述句中使用提示INSERT來跳過這些行。但它比使用檢查或錯誤記錄表的普通插入要慢得多。
begin INSERT INTO TABLE1 VALUES(101, 'JOHN'); INSERT INTO TABLE1 VALUES(102, 'MORN'); INSERT INTO TABLE1 VALUES(103, 'TONY'); INSERT INTO TABLE1 VALUES(103, 'TONY'); INSERT INTO TABLE1 VALUES(103, 'RONY'); end;/
ORA-00001: 違反唯一約束 (FIDDLE_FQMLAYWWHWTRJVYNUNXG.TX) ORA-06512: 在第 5 行
begin INSERT /* ignore_row_on_dupkey_index(TABLE1(NO,NAME))*/ INTO TABLE1 VALUES(101, 'JOHN'); INSERT /* ignore_row_on_dupkey_index(TABLE1(NO,NAME))*/ INTO TABLE1 VALUES(102, 'MORN'); INSERT /* ignore_row_on_dupkey_index(TABLE1(NO,NAME))*/ INTO TABLE1 VALUES(103, 'TONY'); INSERT /* ignore_row_on_dupkey_index(TABLE1(NO,NAME))*/ INTO TABLE1 VALUES(103, 'TONY'); INSERT /* ignore_row_on_dupkey_index(TABLE1(NO,NAME))*/ INTO TABLE1 VALUES(103, 'RONY'); end;/
1 行受影響
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481649.html
下一篇:使用條件引數更新存盤程序
