0

我被一些非常奇怪的东西困住了。昨天我能够产生这样的程序:

create or replace PROCEDURE proc
IS
  CURSOR CUR
  IS
    SELECT * FROM PROVA
    WHERE STATUS = 'X';

BEGIN
  FOR H IN CUR
  LOOP
    BEGIN
      INSERT INTO PROVA2 VALUES H;
      DELETE FROM PROVA WHERE ID = H.ID;
      COMMIT;
    END;
  END LOOP;
END;

其中 PROVA 定义为:

CREATE TABLE PROVA
   (    "ELEMENTO" VARCHAR2(20 BYTE), 
    "DATO" VARCHAR2(20 BYTE), 
    "NUMERO_TENTATIVI" NUMBER(8,0), 
    "STATUS" VARCHAR2(1000 BYTE), 
    "ID" NUMBER(*,0)
   )

PROVA2 定义为:

CREATE TABLE PROVA
   (    "ELEMENTO" VARCHAR2(20 BYTE), 
    "DATO" VARCHAR2(20 BYTE), 
    "NUMERO_TENTATIVI" NUMBER(8,0), 
    "STATUS" VARCHAR2(1000 BYTE), 
    "ID" NUMBER(*,0)
    "DATE_TIME" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP
   )

不幸的是,我的错误,我没有保存并提交正确的程序,所以现在我坚持使用旧程序(当我进行插入时,我必须指定每一列......

INSERT INTO PROVA2(bla,bla,bla...) 
      VALUES (bla,bla,bla...);

我希望 INSERT 部分从表结构中抽象出来,我到处搜索,但没有找到任何证据证明我发布的第一个 PROCEDURE 给我的错误,即:

 ORA-00947: not enough values

所以我的问题是:是否可以将表 X 中的完整记录插入到表 Y 中,该表具有相同的列,但 DATE_TIME 具有默认值(我不想修改......)。

我希望这不是乱七八糟的,我在互联网上到处搜索,但没有运气。

谢谢。

编辑:总结一下:给定一个以 foo,bar,foobar 作为列的表 A,其中 foobar 具有默认值:我可以使用以下方法从以 foo,bar 作为列的表 B 中插入记录“x”:

插入 A 值 x

谢谢

4

1 回答 1

1

您可以使用视图来做到这一点:

create table tmp(
id number
);
create table tmp1(
id number,
dt date default sysdate
);
create view tmp1_vw as select id from tmp1;
insert into tmp1_vw values (1);

结果:

table TMP created.
table TMP1 created.
view TMP1_VW created.
1 rows inserted.

您的程序也有效:

declare
  CURSOR CUR
  IS
    SELECT * FROM tmp;
BEGIN
  FOR H IN CUR
  LOOP
    BEGIN
      INSERT INTO tmp1_vw VALUES H;
    END;
  END LOOP;
END;

并且不要在每条语句之后都提交。


在第 1 条评论后跟进。

您有 2 个结构略有不同的表。

为了解决这个问题,您可以在第二个表上创建一个与第一个表完全相同的视图。然后,从第一个表派生的“记录类型”也将在视图上工作。

于 2014-07-16T14:15:39.150 回答