![](/img/trans.png)
[英]COPY records from table on one database to another Oracle SQL Developer
[英]Copy record from one Oracle SQL table to another with extra columns
这是较大的 Java 程序的一部分,但我正在 Oracle SQL 中寻找一种将记录从一个表复制到另一个表的方法。 原始表为 45 列。 第二个表是原始表的存档表。
编辑 - 它有相同的 45 列,但也有一个 NewKey 列 - 在存档表中创建使用
("NEWKEY" NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1)
和一个 archive_date 列
"ARCHIVEDATE" DATE DEFAULT CURRENT_TIMESTAMP
有没有办法做一个查询
INSERT INTO Archive_Table A
SELECT * (plus NEWKEY, ARCHIVEDATE) FROM Original Table O
WHERE O.CUSTKEY = passed_param;
传递的唯一参数是 CUSTKEY? 一旦从原始表中复制了一条记录,它将从原始表中删除。
ARCHIVEDATE 是一个日期字段,所以它应该默认为 SYSDATE,而不是 CURRENT_TIMESTAMP。 这消除了每个插入的转换。
正如其他人所说,只需列出列:
insert into archivetable (custkey, cola, colb, colc)
select custkey, cola, colb, colc
from originaltable
where custkey = passedparam;
无需包含 NEWKEY 或 ARCHIVEDATE,因为它们将在插入时被初始化。
如果您在半小时前(当您发布问题时)开始输入这 45 列,那么您的代码就已经启动并运行了。
无论如何:在select
中使用星号 ( *
) 可能不是最好的主意; 为了什么? 你期望什么好处? 为了节省一些键盘敲击? 因为,如果您明确命名所有列,您就确切地知道哪个值进入哪个列。 如果在这两个表之一中添加一个新列怎么办? insert into select *
将不再起作用。
您可以使用一些动态 SQL (因此,在 PL/SQL 中)通过查询user_tab_columns
来完成您的要求,将insert into
语句组合在一起,注意差异(身份和时间戳列)。 一旦你完成了编码和测试,正如我所说的 - 一个简单的命名所有这些列将在很久以前完成。
如果我是你,我会这样做:命名所有 45 列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.