[英]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.