我想将一堆记录从临时表复制到目标表。问题是某些记录可能违反目标表中的检查约束,因此我想插入所有可能的内容并在其他地方为无效记录生成错误日志。
如果我执行:
INSERT INTO target_table
SELECT ... FROM temp_table
如果任何记录违反任何约束,则不会插入任何内容。我可以做一个循环并手动插入,但我认为性能会更低。
我想将一堆记录从临时表复制到目标表。问题是某些记录可能违反目标表中的检查约束,因此我想插入所有可能的内容并在其他地方为无效记录生成错误日志。
如果我执行:
INSERT INTO target_table
SELECT ... FROM temp_table
如果任何记录违反任何约束,则不会插入任何内容。我可以做一个循环并手动插入,但我认为性能会更低。
您可以编写一个存储过程来复制记录并使用WHEN ANY DO
语句捕获任何错误,例如
CREATE PROCEDURE CopyRecords( ... )
AS
BEGIN
FOR select ... FROM temp_table INTO ... DO BEGIN
INSERT INTO target_table ...
WHEN ANY DO BEGIN
INSERT INTO ErrorLog(SQL_Code, GDS_Code, ... ) VALUES(SQLCODE, GDSCODE, ...);
END
END
END
该WHEN ... DO
声明记录在InterBase 6.0 语言参考中(向下滚动页面,IB 6 文档下载位于底部),在“过程和触发器”一章下。
像这样:
INSERT INTO
some_table1 (fld1, fld2, fld3)
SELECT
some_table2.fld1,
some_table2.fld2,
some_table2.fld3
FROM
some_table2
WHERE
some_table2.fld > 100
LIMIT
5;