Beste manier om 'n multi-ry insetsel doen in Oracle?
-
09-06-2019 - |
Vra
Ek is op soek na 'n goeie manier om 'n multi-ry insetsels uit te voer in 'n Oracle 9 databasis. Die volgende werke in MySQL maar lyk nie te ondersteun in Oracle.
INSERT INTO TMP_DIM_EXCH_RT
(EXCH_WH_KEY,
EXCH_NAT_KEY,
EXCH_DATE, EXCH_RATE,
FROM_CURCY_CD,
TO_CURCY_CD,
EXCH_EFF_DATE,
EXCH_EFF_END_DATE,
EXCH_LAST_UPDATED_DATE)
VALUES
(1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
Oplossing
Dit werk in Oracle:
insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
Die ding om hier te onthou is om die from dual
verklaring gebruik.
( bron )
Ander wenke
In Oracle, om verskeie rye in tabel t voeg met kolomme col1, col2 en col3 jy kan die volgende opdrag gebruik:
INSERT ALL
INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
.
.
.
SELECT 1 FROM DUAL;
Gebruik SQL * Loader. Dit neem 'n bietjie opstel, maar indien dit nie 'n eenmalige, sy die moeite werd.
Table
SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>
Skep CSV
oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2%
Skep Loader beheer lêer
oracle-2% cat ldr_test.ctl
load data
infile 'ldr_test.csv'
into table ldr_test
fields terminated by "," optionally enclosed by '"'
( id, description )
oracle-2%
Run SQL * Loader command
oracle-2% sqlldr <username> control=ldr_test.ctl
Password:
SQL*Loader: Release 9.2.0.5.0 - Production on Wed Sep 3 12:26:46 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Commit point reached - logical record count 3
Bevestig insetsel
SQL> select * from ldr_test;
ID DESCRIPTION
---------- --------------------
1 Apple
2 Orange
3 Pear
SQL>
SQL * Loader het 'n baie opsies, en kan enige teks lêer as sy insette pretty much neem. Jy kan selfs die data inline in jou beheer lêer as jy wil.
Hier is 'n bladsy met 'n paar meer besonderhede -> SQL * Loader
Wanneer ek nodig het om dit te doen Ek bou 'n eenvoudige PL / SQL blok met 'n plaaslike prosedure soos volg:
declare
procedure ins
is
(p_exch_wh_key INTEGER,
p_exch_nat_key INTEGER,
p_exch_date DATE, exch_rate NUMBER,
p_from_curcy_cd VARCHAR2,
p_to_curcy_cd VARCHAR2,
p_exch_eff_date DATE,
p_exch_eff_end_date DATE,
p_exch_last_updated_date DATE);
begin
insert into tmp_dim_exch_rt
(exch_wh_key,
exch_nat_key,
exch_date, exch_rate,
from_curcy_cd,
to_curcy_cd,
exch_eff_date,
exch_eff_end_date,
exch_last_updated_date)
values
(p_exch_wh_key,
p_exch_nat_key,
p_exch_date, exch_rate,
p_from_curcy_cd,
p_to_curcy_cd,
p_exch_eff_date,
p_exch_eff_end_date,
p_exch_last_updated_date);
end;
begin
ins (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
ins (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
end;
/
As jy die waardes wat jy wil plaas in 'n ander tafel reeds, dan kan jy Voeg uit 'n uitgesoekte verklaring gesê.
INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;
Anders, kan jy 'n klomp van die enkelry insetsel state lys en verskeie navrae stuur in grootmaat aan die tyd te bespaar vir iets wat werk in beide Oracle en MySQL.
@Espo se oplossing is ook 'n goeie een wat sal werk in beide Oracle en MySQL as jou data is nie reeds in 'n tabel.
Cursors kan ook gebruik word, maar dit is ondoeltreffend. Die volgende StackOverflow post bespreek die gebruik van wysers:
INSERT en werk 'n rekord met behulp van wysers in die binneste van 'n>
Jy kan voeg deur gebruik te maak lus as jy wil 'n paar random waardes voeg.
BEGIN
FOR x IN 1 .. 1000 LOOP
INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
SELECT x, 'anyName' FROM dual;
END LOOP;
END;