【发布时间】:2018-02-24 03:37:13
【问题描述】:
所以我有一个将数据从一个表传输到另一个表的存储过程。但是,我意识到如果我不截断第一个表(xml_hours_load),当我最终将此存储过程安排到常规作业中时,我可能会一遍又一遍地插入相同的数据。加载第二个表后如何截断第一个表? (xml_hours_Load_2)。我已经尝试在插入第二个表之后立即放置截断,但是 pl/sql 给我一个错误...
CREATE OR REPLACE PROCEDURE insertXMLDataTransfer(
vROW_ID in xml_hours_load_2.ROW_ID%TYPE,
vUTC_Offset in xml_hours_load_2.UTC_OFFSET%TYPE,
vPROCESSED in xml_hours_load_2.PROCESSED%TYPE,
vDATA_DATE in xml_hours_load_2.Data_Date%TYPE,
vHR_UTC in xml_hours_load_2.HR_UTC%TYPE,
vVALUE_TX in xml_hours_load_2.VALUE_TX%TYPE,
vHR in xml_hours_load_2.HR%TYPE,
vHR_NUM in xml_hours_load_2.HR_NUM%TYPE,
vDATA_CODE in xml_hours_load_2.DATA_CODE%TYPE,
vDATA_TYPE in xml_hours_load_2.DATA_TYPE%TYPE
)
AS
BEGIN
INSERT INTO xml_hours_load_2(ROW_ID, UTC_OFFSET, PROCESSED, DATA_DATE, HR_UTC, VALUE_TX, HR, HR_NUM, DATA_CODE, DATA_TYPE)
VALUES (vROW_ID, vUTC_Offset, vPROCESSED, vDATA_DATE, vHR_UTC, vVALUE_TX, vHR, vHR_NUM, vDATA_CODE, vDATA_TYPE);
TRUNCATE table xml_hours_load;
COMMIT;
END;
/
DECLARE
vROW_ID xml_hours_load_2.ROW_ID%TYPE;
vUTC_Offset xml_hours_load_2.UTC_OFFSET%TYPE;
vPROCESSED xml_hours_load_2.PROCESSED%TYPE;
vDATA_DATE xml_hours_load_2.Data_Date%TYPE;
vHR_UTC xml_hours_load_2.HR_UTC%TYPE;
vVALUE_TX xml_hours_load_2.VALUE_TX%TYPE;
vHR xml_hours_load_2.HR%TYPE;
vHR_NUM xml_hours_load_2.HR_NUM%TYPE;
vDATA_CODE xml_hours_load_2.DATA_CODE%TYPE;
vDATA_TYPE xml_hours_load_2.DATA_TYPE%TYPE;
CURSOR cXMLHoursCursor IS (SELECT ROW_ID, UTC_OFFSET, PROCESSED, DATA_DATE, HR_UTC, VALUE_TX, HR, HR_NUM, DATA_CODE, DATA_TYPE FROM xml_hours_load);
BEGIN
For v in cXMLHoursCursor LOOP
insertXMLDataTransfer(v.ROW_ID, v.UTC_OFFSET, v.PROCESSED, v.DATA_DATE, v.HR_UTC, v.VALUE_TX, v.HR, v.HR_NUM, v.DATA_CODE, v.DATA_TYPE);
COMMIT;
END LOOP;
END;
/
【问题讨论】:
-
您是否考虑过添加主键或唯一键来防止重复? TRUNCATE 几乎是不可恢复的 - 无需实际返回备份。在您的程序中看到 TRUNCATE 代码让我对您的数据感到非常紧张。
-
如果第二个表中的某些主键(已经存在)尝试第二次插入,存储过程会出错吗?我已经为 xml_hours_load 和 xml_hours_load_2 表设置了主键
-
记录会进入,其他人可能会得到 ORA-00001:违反唯一约束...
-
这会阻止所有记录的插入吗?> 或者只是那些重复的记录?好像当我用重复的条目测试程序时,程序一起出错并且没有插入任何东西