是否可以将行类型 X 的记录插入行类型 Y 的表中?
Posted
技术标签:
【中文标题】是否可以将行类型 X 的记录插入行类型 Y 的表中?【英文标题】:Is it possible to insert a record with rowtype X into a table with rowtype Y? 【发布时间】:2014-07-16 12:55:19 【问题描述】:我遇到了一些非常奇怪的事情。 昨天我能够产生这样的程序:
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
谢谢
【问题讨论】:
【参考方案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 个结构略有不同的表。
要解决这个问题,您可以在第二个表上创建一个视图,使其看起来与第一个表完全相同。然后,从第一个表派生的“记录类型”也将在视图上工作。
【讨论】:
我认为这不是我想要的,但也许我没有得到你的答案。想象一下,您有表 A 并希望从所有具有特定状态的列 A 的记录中清除它(列:STATUS -> SUCCESS),并且您希望将每条清除的记录放入一个完全相同的新表中,但还有 1 列:清除完成的日期。在您的示例中,视图具有相同数量的表列,这不是我要找的。我同意每条声明后的提交,谢谢:) 我的表有 2 列 id 和 dt。我的视图只有 1 个列 ID。当我将视图用作表并将记录插入其中时,记录实际上是插入到原始表中,dt 列是从默认值填充的。我以一个列 id 为例,你可能有一组列。以上是关于是否可以将行类型 X 的记录插入行类型 Y 的表中?的主要内容,如果未能解决你的问题,请参考以下文章
对于表中的行,将行保存在临时表中以在 plpgsql 的选择查询中使用其数据