【问题标题】:How to truncate a table after inserting data into another table using pl/sql?使用pl/sql将数据插入另一个表后如何截断一个表?
【发布时间】: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:违反唯一约束...
  • 这会阻止所有记录的插入吗?> 或者只是那些重复的记录?好像当我用重复的条目测试程序时,程序一起出错并且没有插入任何东西

标签: sql oracle plsql


【解决方案1】:

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

your_first_query;

execute immediate ('truncate table xml_hours_load');

your_second_query;

[编辑]

说你有一个错误(必须声明立即),好吧——你做错了什么;看看这个例子:

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>

如果您可以编辑您的帖子并向我们展示您所做的事情,那么进一步提供帮助可能会更容易。

【讨论】:

  • 谢谢!我只需要将它嵌入到第一个代码块中!
  • 啊哈;好的,所以你找到了原因。 我们遇到了敌人,他们就是我们 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2011-06-24
  • 1970-01-01
  • 2012-03-23
  • 2022-01-12
相关资源
最近更新 更多