我有两张不完全相同但相似的桌子。它们看起来像这样:
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_VALID
为1
,则记录有效。
这就是我想要的:
SELECT * FROM FIRST_TABLE f WHERE f.FIRST_VALID like '1';
循环浏览我从选择查询中获得的所有记录,并INSERT
除VALID
INTO
SECOND_TABLE
和DELETE
之外的所有内容。
那是我遇到问题的地方。这就是我所拥有的:
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;
你能给我一个提示,告诉我如何访问循环记录中的当前值以将一些值插入到另一个表中吗?或者有更好的方法吗?
答案 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;