我被一些奇怪的东西困住了。昨天我能够产生这样一个过程:
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
谢谢
您可以使用视图来做到这一点:
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个表,结构略有不同。
要解决该问题,您可以在第二张表上进行查看,使其看起来与第一张表完全相同。然后,从第一个表派生的“记录类型”也将在视图上工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句