是否可以将行类型 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 的选择查询中使用其数据

AJAX如何动态地将行添加到表中

使用 jdbc 将行批量插入 Spanner 时加载性能低

将行从一个表插入到另一个表中,哪个 sql 更有效(外连接 vs 顺序扫描)

将行插入表中