PECS (сокращение от «Производитель extends
и Consumer super
») объясняется: принципом «Get and Put»
Указывает, что
1. For Extends Wildcard (получить значения, т. Е. Producer extends
)
Вот метод, который берет набор чисел, преобразует каждый в double
и суммирует их вверх
public static double sum(Collection<? extends Number> nums) {
double s = 0.0;
for (Number num : nums)
s += num.doubleValue();
return s;
}
Назовем метод:
List<Integer>ints = Arrays.asList(1,2,3);
assert sum(ints) == 6.0;
List<Double>doubles = Arrays.asList(2.78,3.14);
assert sum(doubles) == 5.92;
List<Number>nums = Arrays.<Number>asList(1,2,2.78,3.14);
assert sum(nums) == 8.92;
Поскольку метод sum()
использует extends
, все следующие вызовы являются законными. Первые два вызова не были бы законными, если бы расширения не использовались.
ИСКЛЮЧЕНИЕ : вы не можете помещать что-либо в тип, объявленный с помощью подстановочного знака extends
, за исключением значения null
, который относится к каждому ссылочному типу:
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(null); // ok
assert nums.toString().equals("[1, 2, null]");
2. Для Super Wildcard (put values ie Consumer super
)
Вот метод, который принимает набор чисел и int n
, и помещает первые n
целые числа, начиная с нуля, в сбор:
public static void count(Collection<? super Integer> ints, int n) {
for (int i = 0; i < n; i++) ints.add(i);
}
Давайте назовем метод:
List<Integer>ints = new ArrayList<Integer>();
count(ints, 5);
assert ints.toString().equals("[0, 1, 2, 3, 4]");
List<Number>nums = new ArrayList<Number>();
count(nums, 5); nums.add(5.0);
assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]");
List<Object>objs = new ArrayList<Object>();
count(objs, 5); objs.add("five");
assert objs.toString().equals("[0, 1, 2, 3, 4, five]");
Поскольку метод count()
использует super
, все следующие звонки законны: последние два вызова не были бы законными, если бы супер не использовался.
ИСКЛЮЧЕНИЕ : вы не можете получить что-либо из типа, объявленного с помощью super
за исключением значения типа Object
, которое является супертипом каждого ссылочного типа:
List<Object> objs = Arrays.<Object>asList(1,"two");
List<? super Integer> ints = objs;
String str = "";
for (Object obj : ints) str += obj.toString();
assert str.equals("1two");
3. Когда оба Get и Put, не используйте wildcard
. Когда вы оба вставляете значения и получаете значения из одной и той же структуры, вы не должны использовать подстановочный знак.
public static double sumCount(Collection<Number> nums, int n) {
count(nums, n);
return sum(nums);
}
Это работает в 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
вещь помнить здесь состоит в том, чтобы использовать from dual
оператор.
( источник )
В Oracle для вставки нескольких строк в таблицу t со столбцами col1, col2 и col3 можно использовать следующий синтаксис:
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;
Используйте SQL*Loader. Это занимается небольшой установкой, но если это не то прочь, стоящий того.
Создают Таблицу
SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>
, Создают CSV
oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2%
, Создают команду Run SQL*Loader Файла 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
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%
SQL> select * from ldr_test;
ID DESCRIPTION
---------- --------------------
1 Apple
2 Orange
3 Pear
SQL>
, SQL*Loader имеет много опций и может взять в значительной степени любой текстовый файл в качестве его входа. Можно даже встроить данные в файле управления, если Вы хотите.
Вот страница еще с некоторыми деталями-> SQL*Loader
Каждый раз, когда я должен сделать это, я создаю простой МН блок / блок SQL с локальной процедурой как это:
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;
/
Если у Вас есть значения, которые Вы хотите уже вставить в другую таблицу, то можно Вставить от избранного оператора.
INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;
Иначе, можно перечислить набор единственной строки, вставляют операторы и отправляют несколько запросов оптом, чтобы сэкономить время для чего-то, что работает и в Oracle и в MySQL.
решением @Espo является также хорошее, которое будет работать и в Oracle и в MySQL, если Ваши данные уже не будут в таблице.
В моем случае я смог использовать простой оператор вставки для объемной вставки много строк в TABLE_A, использующий всего один столбец от TABLE_B и получающий другие данные в другом месте (последовательность и значение hardcoded):
INSERT INTO table_a (
id,
column_a,
column_b
)
SELECT
table_a_seq.NEXTVAL,
b.name,
123
FROM
table_b b;
Результат:
ID: NAME: CODE:
1, JOHN, 123
2, SAM, 123
3, JESS, 123
и т.д.