【问题标题】:Is it possible to insert a record with rowtype X into a table with rowtype Y?是否可以将行类型 X 的记录插入行类型 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

谢谢

【问题讨论】:

    标签: oracle rowtype ora-00947


    【解决方案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 为例,你可能有一组列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2011-09-15
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多