将记录迁移到另一个表

时间:2015-06-12 12:20:07

标签: sql oracle plsql

我有两张不完全相同但相似的桌子。它们看起来像这样:

CREATE TABLE FIRST_TABLE(
  FIRST_ID          RAW(16)                                   NOT NULL CONSTRAINT FIRST_PK PRIMARY KEY,
  FIRST_NAME        VARCHAR2(2000),
  FIRST_VALID       NUMBER(1)                                 NOT NULL,
  AUDIT_CRE_AT      TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP    NOT NULL,
  AUDIT_CRE_FROM    VARCHAR2(32) DEFAULT 'system'             NOT NULL,
  CONSTRAINT SECOND_VALID CHECK (SECOND_VALID IN (0,1))
);

CREATE TABLE SECOND_TABLE(
  SECOND_ID          RAW(16)                                 NOT NULL CONSTRAINT SECOND_PK PRIMARY KEY,
  SECOND_NAME        VARCHAR2(2000),
  AUDIT_CRE_AT       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP  NOT NULL,
  AUDIT_CRE_FROM     VARCHAR2(32) DEFAULT 'system'           NOT NULL,
);

现在,如果记录有效,我想将所有记录从FIRST_TABLE迁移到SECOND_TABLE。如果FIRST_VALID1,则记录有效。 这就是我想要的:

  • 从FIRST_TABLE
  • 中选择所有有效记录

SELECT * FROM FIRST_TABLE f WHERE f.FIRST_VALID like '1';

  • 循环浏览我从选择查询中获得的所有记录,并INSERTVALID INTO SECOND_TABLEDELETE之外的所有内容。 那是我遇到问题的地方。这就是我所拥有的:

    DECLARE 
    v_count_valids NUMBER(10):= 0;
    v_i NUMBER(10):=0; 
    
    
    BEGIN
         SELECT COUNT(*) INTO v_count_valids FROM FIRST_TABLE f WHERE f.VALID like '1'; 
         WHILE  v_i <= v_count_valids
         LOOP
             --INSERT INTO SECOND_TABLE VALUES (current record...)
             --DELETE current record
             v_i := v_i + 1;
         END LOOP;
    END;
    

你能给我一个提示,告诉我如何访问循环记录中的当前值以将一些值插入到另一个表中吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

您不需要循环。您可以改为使用insert-select语句:

INSERT INTO second_table (second_id, second_name, audit_cre_at, audit_cre_from)
SELECT first_id, first_name, audit_cre_at, audit_cre_from
FROM   first_table
WHERE  valid = 1

答案 1 :(得分:0)

只需使用insert . . . select

insert into second_table(second_id, second_name, audit_cre_at, audit_cre_from)
    SELECT first_id, first_name, audit_cre_at, audit_cre_from
    FROM FIRST_TABLE f
    WHERE f.FIRST_VALID = 1;

您不需要PL / SQL。此外,在比较数字时,请使用数字常量和=,而不是like和字符串。

答案 2 :(得分:0)

正如其他人提到的,不需要编写PL/SQL代码。首先,使用以下查询将您的所有特定数据从First_Table放到Second_Table

INSERT INTO SECOND_TABLE(SECOND_ID, SECOND_NAME, AUDIT_CRE_AT, AUDIT_CRE_FROM)
    SELECT FIRST_ID, FIRST_NAME, AUDIT_CRE_AT, AUDIT_CRE_FROM FROM FIRST_TABLE WHERE FIRST_VALID = 1;

然后,正如您所提到的,您需要删除它们。然后,写入删除查询

DELETE FROM FIRST_TABLE WHERE FIRST_VALID = 1;