2012-02-20 2 views
0

Вид идиота, который Oracle не поддерживает этот тип вставки, как бы это сделать в Oracle?Оператор вставки нескольких строк Oracle

INSERT INTO WEBSITE_GATEKEEPER_STATE (PRG_CODE, STATE) VALUES("BPA", "AL"), ("BPA", "AK"), ("BPA", "AS"), ("BPA", "AZ"), ("BPA", "AR"), ("BPA", "AF"), 
("BPA", "AA"), ("BPA", "AC"), ("BPA", "AE"), ("BPA", "AM"), ("BPA", "AP"), ("BPA", "CA"), ("BPA", "CO"), ("BPA", "CT"), ("BPA", "DE"), ("BPA", "DC"), 
("BPA", "FM"), ("BPA", "FL"), ("BPA", "GA"), ("BPA", "GU"), ("BPA", "HI"), ("BPA", "ID"), ("BPA", "IL"), ("BPA", "IN"), ("BPA", "IA"), ("BPA", "KS"), 
("BPA", "KY"), ("BPA", "LA"), ("BPA", "ME"), ("BPA", "MH"), ("BPA", "MD"), ("BPA", "MA"), ("BPA", "MI"), ("BPA", "MN"), ("BPA", "MS"), ("BPA", "MO"), 
("BPA", "MT"), ("BPA", "NE"), ("BPA", "NV"), ("BPA", "NH"), ("BPA", "NJ"), ("BPA", "NM"), ("BPA", "NY"), ("BPA", "NC"), ("BPA", "ND"), ("BPA", "MP"), 
("BPA", "OH"), ("BPA", "OK"), ("BPA", "OR"), ("BPA", "PW"), ("BPA", "PA"), ("BPA", "PR"), ("BPA", "RI"), ("BPA", "SC"), ("BPA", "SD"), ("BPA", "TN"), 
("BPA", "TX"), ("BPA", "UT"), ("BPA", "VT"), ("BPA", "VI"), ("BPA", "VA"), ("BPA", "WA"), ("BPA", "WV"), ("BPA", "WI"), ("BPA", "WY"); 
+1

Как это возможно: http://www.techonthenet.com/oracle/questions/insert_rows.php –

+0

почему вы не публикуете в качестве ответа ? Он работал так, что я выберу как ответ, если вы опубликуете как один. – MB34

+2

Дубликат: http://stackoverflow.com/q/4152037. Обратите внимание, что здесь нет ничего особенного в PL/SQL - это просто Oracle SQL, который может быть выполнен также в контексте PL/SQL. – user272735

ответ

3
+0

В чем преимущество написания нескольких инструкций INSERT (по одному для каждой строки)? –

+1

Небольшое количество накладных расходов. Совместное использование курсора не очень хорошо работает с SQL, у которого нет переменных привязки, поэтому каждая итерация чего-то вроде этой инструкции вставки одной строки требует повторного анализа. На самом деле, это не такая уж большая сделка, если вы не загружаете большое количество строк, которые OP, похоже, не делает. –

+2

Для этого примера жесткие разборки не имели бы никакого значения. Если большое количество строк должно быть загружено подготовленным оператором или даже SQL * Loader является ** намного лучшим выбором –

3

Я предполагаю, что это зависит от своего определения "идиотским". Эта вещь - это то, что нужно делать с загрузкой данных, которую мы должны делать только изредка. Поэтому не очень сложно использовать cut'n'paste для создания скрипта, который соответствует доступному синтаксису.

или grep. Я использовал regex в редакторе, чтобы превратить ваш код в жизнеспособный код PL/SQL. Проверьте это:

declare 
    strs dbms_debug_vc2coll; 
begin 
    strs := dbms_debug_vc2coll ('AL', 'AK', 'AS', 'AZ', 'AR', 'AF', 
     'AA', 'AC', 'AE', 'AM', 'AP', 'CA', 'CO', 'CT', 'DE', 'DC', 
     'FM', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 
     'KY', 'LA', 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 
     'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 
     'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 
     'TX', 'UT', 'VT', 'VI', 'VA', 'WA', 'WV', 'WI', 'WY'); 


    INSERT INTO WEBSITE_GATEKEEPER_STATE (PRG_CODE, STATE) 
    select 'PA', column_value 
    from table (select * from strs); 

end; 
/ 
0

этим путем

DECLARE 

var_sql clob; 
var_bpa varchar2(3):='BPA'; 

BEGIN 

var_sql := 'insert all '; 
var_sql :=var_sql||' into website_gatekeeper_state (prg_code, state) 
values('''||var_bpa||''', ''AL'')'; 
var_sql :=var_sql||' into website_gatekeeper_state (prg_code, state) 
values('''||var_bpa||''', ''AF'')'; 
var_sql :=var_sql||' into website_gatekeeper_state (prg_code, state) 
values('''||var_bpa||''', ''AM'')'; 
var_sql :=var_sql||' into website_gatekeeper_state (prg_code, state) 
values('''||var_bpa||''', ''AP'')'; 
var_sql :=var_sql||' into website_gatekeeper_state (prg_code, state) 
values('''||var_bpa||''', ''DC'')'; 
var_sql :=var_sql||' select 1 from dual '; 

EXECUTE IMMEDIATE var_sql; 

END; 
0

вы можете использовать & variable_name ввести значения во время выполнения вместо того, чтобы писать каждое новое заявление.

For example - 
INSERT INTO WEBSITE_GATEKEEPER_STATE (PRG_CODE, STATE) 
VALUES(&PRG_CODE, &STATE); 
0
INSERT ALL 
    INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n) 
    INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n) 
    INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n) 
SELECT * FROM dual; 

или ...

insert into mytable (column1, column2, .. columnn) 
      select value1, value2 ... valuen from dual 
union all select value1, value2 ... valuen from dual