【问题标题】:Oracle multi-row insert statementOracle 多行插入语句
【发布时间】:2012-02-20 16:49:16
【问题描述】:

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");

【问题讨论】:

标签: sql oracle sql-insert


【解决方案1】:

【讨论】:

  • 与编写多个 INSERT 语句(每行一个)相比有什么优势?
  • 少量开销。游标共享不适用于没有绑定变量的 SQL,因此类似一行插入语句的每次迭代都需要重新解析。真的,除非您加载大量行,否则这没什么大不了的,而 OP 似乎没有这样做。
  • 例如,硬解析根本不重要。如果应该加载大量行,则准备好的语句甚至 SQL*Loader 是很多更好的选择
  • 您能否在答案中添加一个示例,而不仅仅是外部链接 - 它可以让未来的访问者更轻松,并防止链接腐烂使您的答案贬值...
【解决方案2】:

我想这取决于一个人对“白痴”的定义。这就是我们应该只是偶尔做的那种数据加载。因此,使用 cut'n'paste 生成符合可用语法的脚本并不是什么大问题。

grep。我在编辑器中使用正则表达式将您的代码转换为可行的 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;
 /  

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:

      您可以使用 &variable_name 在运行时输入值,而不是编写每个新语句。

      For example -
       INSERT INTO WEBSITE_GATEKEEPER_STATE (PRG_CODE, STATE) 
       VALUES(&PRG_CODE, &STATE);
      

      【讨论】:

        【解决方案5】:

        这样

        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-21
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多