我遇到了一些非常奇怪的事情。 昨天我能够制作这样的程序:
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中,表Y具有相同的列,但DATE_TIME具有默认值(我不想修改...)
我希望这不是很混乱,我在互联网上到处搜索这个没有运气。
感谢。
编辑: 总结一下: 给定一个表A,其中foo,bar,foobar作为列,其中foobar具有默认值:我可以从具有foo的表B中插入记录'x',使用以下列作为列:
插入A值x
由于
答案 0 :(得分: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;
每次发言后都不要提交。
在第一次评论后跟进。
您有2个表格,结构略有不同。
要解决此问题,请在第二个表上创建一个与第一个表完全相同的视图。然后,从第一个表派生的“记录类型”也将在视图上工作。