【问题标题】:How to insert multimple records of numbers with one statement in ORACLE and Sql-server using the same sentenceORACLE和Sql-server中如何用同一个语句插入多条数字记录
【发布时间】:2010-12-15 15:19:42
【问题描述】:

在我的 C++ 程序中,我尝试过这样的事情:

插入到 TEMP_TABELA (OSE_ID) 值 (7,12,16,17,19,21,24,26,30,33,35,38,42,46,53,58,59,72,73,74 ,77,78,82,86,87,88,89,91,92,93,100,101,102,104,106,109,113,115,127,133,139,140,​​142,143,144,148,149,150,151,153,155,160,164,166,167,170,172,178,188,189,191,192,198,199,200,201,202,203,205,207,208,219,220,223,225,231,233,236,240,241,242,244,245,253);

但我得到的只是: 说明:INSERT 语句中的列数少于 VALUES 子句中指定的值。 VALUES 子句中的值数必须与 INSERT 语句中指定的列数相匹配。 来源:Microsoft OLE DB Provider for SQL Server

同样的句子也必须适用于 Oracle,因为我的程序适用于两者。 谁能帮帮我?

【问题讨论】:

  • 我猜你的表 TEMP_TABELA 有一个数字类型的列,你想用插入语句插入多个值。 SQL-Server 2008 有一个支持它的系统税,但它不适用于 ORACLE。
  • 并给出@Harrison 的回答,反之亦然;-)

标签: sql sql-server oracle


【解决方案1】:

Oracle 和 SQL Server 的批量插入语法彼此不同,因此最安全的方法是使用单独的 INSERT 语句:

INSERT INTO TEMP_TABELA (OSE_ID) values (7);
INSERT INTO TEMP_TABELA (OSE_ID) values (12);
INSERT INTO TEMP_TABELA (OSE_ID) values (16);
INSERT INTO TEMP_TABELA (OSE_ID) values (17);
...  
INSERT INTO TEMP_TABELA (OSE_ID) values (253);

【讨论】:

  • 看起来这是目前唯一的选择。我会等几个小时(这就是我必须完成我的任务的所有时间),如果没有其他事情发生在我们身上……好吧,就这样吧。显而易见的,我真的想更快地做点什么……
  • 这是我现在能看到的唯一可行的选项,所以我给出这个答案正确的标题答案:) 谢谢大家!
  • 你可以看看我从这个答案中得出的下一个问题,关于如何在 C++ 中实现它。 stackoverflow.com/questions/4459218/…
【解决方案2】:

这在 Oracle 中有效,它在字符串上拆分(假设 10g+)

CREATE TABLE TESTX(NUM NUMBER);

INSERT INTO TESTX(NUM)
select regexp_substr (x, '[^,]+', 1, level) as token
  from (SELECT '7,12,16,17,19,21,24,26,30,33,35,38,42,46,53,58,59,72,73,74,77,78,82,86,87,88,89,91,92,93,100,101,102,104,106,109,113,115,127,133,139,140,142,143,144,148,149,150,151,153,155,160,164,166,167,170,172,178,188,189,191,192,198,199,200,201,202,203,205,207,208,219,220,223,225,231,233,236,240,241,242,244,245,253' X FROM DUAL) t
connect by  regexp_instr (x, '[^,]+', 1, level) > 0  


84 rows inserted

【讨论】:

  • 我怀疑这是否适用于 SQL Server,因为我不认为那里存在 regexp 函数。不错的 Oracle 解决方案!
  • 这在 Sql Server 上不起作用,但感谢您提供的可能性。
  • 是的,很抱歉,这是非常特定于 Oracle 的。我想不出一种适用于两者的单行解决方案(并且无法访问 SQL Server 框进行测试!)
【解决方案3】:

为 Oracle 执行此操作:

INSERT INTO TEMP_TABELA (OSE_ID)
select 7 from dual union all
select 12 from dual union all
select 16 from dual union all
select 17 from dual union all
select 19 from dual union all
select 21 from dual union all
select 24 from dual union all
select 26 from dual union all
select 30 from dual union all
select 33 from dual union all
select 35 from dual union all
select 38 from dual union all
select 42 from dual union all
select 46 from dual union all
select 53 from dual union all
select 58 from dual union all
select 59 from dual union all
select 72 from dual union all
select 73 from dual union all
select 74 from dual union all
select 77 from dual union all
select 78 from dual union all
select 82 from dual union all
select 86 from dual union all
select 87 from dual union all
select 88 from dual union all
select 89 from dual union all
select 91 from dual union all
select 92 from dual union all
select 93 from dual union all
select 100 from dual union all
select 101 from dual union all
select 102 from dual union all
select 104 from dual union all
select 106 from dual union all
select 109 from dual union all
select 113 from dual union all
select 115 from dual union all
select 127 from dual union all
select 133 from dual union all
select 139 from dual union all
select 140 from dual union all
select 142 from dual union all
select 143 from dual union all
select 144 from dual union all
select 148 from dual union all
select 149 from dual union all
select 150 from dual union all
select 151 from dual union all
select 153 from dual union all
select 155 from dual union all
select 160 from dual union all
select 164 from dual union all
select 166 from dual union all
select 167 from dual union all
select 170 from dual union all
select 172 from dual union all
select 178 from dual union all
select 188 from dual union all
select 189 from dual union all
select 191 from dual union all
select 192 from dual union all
select 198 from dual union all
select 199 from dual union all
select 200 from dual union all
select 201 from dual union all
select 202 from dual union all
select 203 from dual union all
select 205 from dual union all
select 207 from dual union all
select 208 from dual union all
select 219 from dual union all
select 220 from dual union all
select 223 from dual union all
select 225 from dual union all
select 231 from dual union all
select 233 from dual union all
select 236 from dual union all
select 240 from dual union all
select 241 from dual union all
select 242 from dual union all
select 244 from dual union all
select 245 from dual union all
select 253 from dual

这适用于 SQL Server:

INSERT INTO TEMP_TABELA (OSE_ID) 
select 7 union all
select 12 union all
select 16 union all
select 17 union all
select 19 union all
select 21 union all
select 24 union all
select 26 union all
select 30 union all
select 33 union all
select 35 union all
select 38 union all
select 42 union all
select 46 union all
select 53 union all
select 58 union all
select 59 union all
select 72 union all
select 73 union all
select 74 union all
select 77 union all
select 78 union all
select 82 union all
select 86 union all
select 87 union all
select 88 union all
select 89 union all
select 91 union all
select 92 union all
select 93 union all
select 100 union all
select 101 union all
select 102 union all
select 104 union all
select 106 union all
select 109 union all
select 113 union all
select 115 union all
select 127 union all
select 133 union all
select 139 union all
select 140 union all
select 142 union all
select 143 union all
select 144 union all
select 148 union all
select 149 union all
select 150 union all
select 151 union all
select 153 union all
select 155 union all
select 160 union all
select 164 union all
select 166 union all
select 167 union all
select 170 union all
select 172 union all
select 178 union all
select 188 union all
select 189 union all
select 191 union all
select 192 union all
select 198 union all
select 199 union all
select 200 union all
select 201 union all
select 202 union all
select 203 union all
select 205 union all
select 207 union all
select 208 union all
select 219 union all
select 220 union all
select 223 union all
select 225 union all
select 231 union all
select 233 union all
select 236 union all
select 240 union all
select 241 union all
select 242 union all
select 244 union all
select 245 union all
select 253

【讨论】:

    【解决方案4】:

    示例中语句中的括号向 SQL Server 表明您希望将所有内容放在一行中。您需要将每一行括在括号中并用逗号分隔,即:

    INSERT INTO TEMP_TABELA (OSE_ID) 
    values  (7),
            (12),
            (16),
            (17),
            (19),
            (21),
            (24),...
    

    我不确定这是否适用于 Oracle,但如果不是,您可能需要在调用应用程序中创建一个条件以确定它正在使用哪个数据库并适当地修改查询。

    【讨论】:

    • 不适用于 Oracle。我希望它这样做(或类似的东西)。
    【解决方案5】:

    与@OMGPonies 类似,也可以执行以下操作:

    INSERT INTO TEMP_TABLEA(OSE_ID)
    SELECT 7 union all
    SELECT 12 ...
    

    不确定哪个更快,或者即使考虑到您要插入的项目数量,您是否关心速度。

    没有在 oracle 上测试过,但我有大约 90% 的把握它会工作。

    【讨论】:

    • 需要“从双重 UNION ALL 中选择 7...”。 Oracle 要求所有 SELECT 语句都有 FROM 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多