簡體   English   中英

將記錄從一個 Oracle SQL 表復制到另一個具有額外列的表

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM