1. 程式人生 > 資料庫 >從Oracle資料庫中讀取資料自動生成INSERT語句的方法

從Oracle資料庫中讀取資料自動生成INSERT語句的方法

Oracle INSERT 語句

方法1

我估計有點 SQL 基礎的人都會寫 INSERT 語句。下面是 SQL 標準寫法。

INSERT INTO employees (employee_id,name) VALUES (1,'Zhangsan');
INSERT INTO employees VALUES (1,'Shangbo');

方法2

其實, Oracle 還支援下面的寫法,作用和上面的語句完全相同。

INSERT INTO (SELECT employee_id,name FROM employees) VALUES (2,'Lisi');

方法3

此外,同其他資料庫一樣,Oracle 也支援下面這種寫法。

INSERT INTO employees
SELECT 3,'Wangwu' FROM DUAL;

方法4

下面這種寫法可以實現列轉行,如我們有下面的表儲存原始資料,原始資料可能從檔案中來。

create table sales_input_table (
prod_id    number(9,0),amt_mon    number(9,6),amt_tue    number(9,amt_wed    number(9,amt_thu    number(9,amt_fri    number(9,6)
);
insert into sales_input_table values (1,100.0,200.0,300.0,400.0,500.0);

下面我們通過一個 SQL 把上面的資料插入到下面的表中實現列轉行。

CREATE TABLE sales (
prod_id    number(9,time_id    date,amount     number(9,0)
);
INSERT ALL
INTO sales (prod_id,time_id,amount) VALUES (prod_id,CURRENT_DATE,amt_mon)
INTO sales (prod_id,CURRENT_DATE + 1,amt_tue)
INTO sales (prod_id,CURRENT_DATE + 2,amt_wed)
INTO sales (prod_id,CURRENT_DATE + 3,amt_thu)
INTO sales (prod_id,CURRENT_DATE + 4,amt_fri)
SELECT prod_id,amt_mon,amt_tue,amt_wed,amt_thu,amt_fri FROM sales_input_table;

方法5

下面這種寫法可以幫我們一次性把一個表中的資料倒入到多個表中,否則我們必須寫多條 SQL 實現同樣的功能。

INSERT ALL
WHEN order_total <= 100000 THEN
INTO small_orders
WHEN order_total > 100000 AND order_total <= 200000 THEN
INTO medium_orders
WHEN order_total = 500000 THEN
INTO special_orders
WHEN order_total > 200000 THEN
INTO large_orders
ELSE
INTO large_orders
SELECT order_id,order_total,sales_rep_id,customer_id FROM orders;

注意,當 order_total 大於 200000 時,orders 會被插入到 large_orders 和 special_orders 中。這可能不是你想要的結果,如果你只想讓 orders 插入到 special_orders 表中,你只需要把 ALL 替換成 FIRST, 如下。

INSERT FIRST
WHEN order_total <= 100000 THEN
INTO small_orders
WHEN order_total > 100000 AND order_total <= 200000 THEN
INTO medium_orders
WHEN order_total = 500000 THEN
INTO special_orders
WHEN order_total > 200000 THEN
INTO large_orders
ELSE
INTO large_orders
SELECT order_id,customer_id FROM orders;

從Oracle資料庫中讀取資料,自動生成INSERT語句

建立表

-- Create table
create table TB_ACCIDENT_TYPE
(
 ID     NUMBER(20) not null,NAME    VARCHAR2(50),PATH    VARCHAR2(20),PARENTPATH VARCHAR2(20),URL    VARCHAR2(20),TYPE    VARCHAR2(2),DESCR   VARCHAR2(50)
)

顯示錶中的資料

select 'INSERT INTO tb_accident_type (ID,NAME,PATH,PARENTPATH,URL,TYPE,DESCR)
 VALUES(' || '''' || ID ||'''' || ','
|| '''' || NAME || '''' || ','
|| '''' || PATH || '''' || ','
|| '''' || PARENTPATH || '''' || ','
|| '''' || URL || '''' || ','
|| '''' || TYPE || '''' || ','
|| '''' || DESCR || '''' || ');' 
 From tb_accident_type order by ID

顯示結果

INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('1','事故型別關聯 ','1','0','','');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('2','危險源型別關聯','2',DESCR)
 VALUES('3','危險品型別關聯','3',DESCR)
 VALUES('4','生產企業型別關聯','4',DESCR)
 VALUES('5','區域關聯','5',DESCR)
 VALUES('568','物體打擊','1.1','物體打擊');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('569','車輛傷害','1.2','車輛傷害');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('570','機器傷害','1.3','機器傷害');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('571','起重傷害','1.4','起重傷害');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('572','觸電','1.5','觸電');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('573','淹溺','1.6','淹溺');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('574','灼燙','1.7','灼燙');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('575','火災','1.8','火災');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('576','高處墜落','1.9','高處墜落');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('577','坍塌','1.10','坍塌');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('578','冒頂片幫','1.11','冒頂片幫');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('580','透水','1.12','透水');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('581','波炮','1.13','波炮');INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('582','火藥爆炸','1.14','火藥爆炸')INSERT INTO tb_accident_type (ID,DESCR)
 VALUES('583','瓦斯爆炸','1.15','瓦斯爆炸');

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結