如何在使用pl / sql将数据插入另一个表后截断表?

时间:2018-02-23 19:28:34

标签: sql oracle plsql

所以我有一个存储过程将数据从一个表传输到另一个表。但是,我意识到,如果我不截断第一个表(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;
/

1 个答案:

答案 0 :(得分:1)

你不能直接在PL / SQL中截断它;你必须使用动态SQL,即

your_first_query;

execute immediate ('truncate table xml_hours_load');

your_second_query;

<强> [编辑]

说你有错误(必须申报IMMEDIATE),好吧 - 你做错了什么;看看这个例子:

SQL> create table test (id number);

Table created.

SQL> begin
  2    execute immediate ('truncate table test');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>

如果您可以编辑帖子并向我们展示您的所作所为,则可能更容易进一步提供帮助。