`

用一条insert语句来插入多行数据

阅读更多
oracle、sqlserver不支持insert into t(x) values (),();
只有mysql支持 insert into t(x) values (),();

insert all 遇到 sequence
当insert all 遇到 sequence
这几天在修改商函2.0中相关的PL/SQL包代码时,在实现这样一个SQL时:
insert all into bo(object_name,sn) values(object_name,seqkey)
                into co(object_name,sn)  values(object_name,seqkey)
select object_name ,sq1.nextval from ao
ORACLE 报ORA-02287错,原因是INSERT ALL 需要插入多表,但SELECT部分的SEQUENCE不允许一次SELECT多值,解决方案有两个:
方法一:编一个函数,将获取sq1.nextval的过程写在函数中,再在select 部分引用函数,如下:
create or replace function f_getseqkey return number is
result number;
begin
select sq1.nextval into result from dual ;
return result ;
end;

SQL:insert all into bo(object_name,sn) values(object_name,seqkey)
                        into co(object_name,sn) values(object_name,seqkey-1)
select object_name ,f_getseqkey() seqkey from ao;
说明:这里有个-1的行为,研究发现,在插入多表时,实际上后面的SELECT是有做两次NEXTVAL行为的,而为了确保两个INTO插入同样的序列值,则人为进行-1插作,这个方案的后果是会多用序列值,在插入更多表的情况下,可能造成应用键值紧张,另外额外调用函数,性能也会下降。
方法二:
SQL:insert all into bo(object_name,sn) values(object_name,sq1.nextval)
                          into co(object_name,sn) values(object_name,sq1.nextval)
          select object_name from ao 
这个方法最好,无需定义函数,也不多用序列,性能也好,
现象:在两个INTO中都使用了NEXTVAL,但能确保是相同的值吗?答案是OK,因为INSERT ALL 到多表,在ORACLE看来是同一SQL,即类同:SELECT SEQ.NEXTVAL,SEQ.NEXTVAL FROM DUAL这样的SQL,同一SQL中多次调用同一序列,值相同。但如果在同一SQL中多次调用这个自定义函数,则会获得不同的值。


部分来自于:http://blog.csdn.net/xuxurui007/article/details/7692065
分享到:
评论

相关推荐

    Yii框架批量插入数据扩展类的简单实现方法

    MySQL INSERT语句允许插入多行数据,如下所示: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 那么要实现批量插入,主要的任务就是按照列顺序,把数据组装成上述格式即可,可以使用sprintf和...

    必须会的SQL语句(三) 数据插入

    1.规范一些使用插入语句的小规范  1)中文字符串前 最好 加一个N ...3.多行一条语句插入多行 insert into 表名 ([列1],[列2])  select ‘值1′,’值2’ union all –这里呢,union 和 union all的 区别  

    精通sql结构化查询语句

    11.1.4 由VALUES关键字插入多行数据 11.1.5 使用SELECT语句插入数据 11.1.6 通过视图插入数据 11.1.7 使用子查询插入数据 11.2 数据的更新操作 11.2.1 UPDATE语句的基本语法 11.2.2 使用UPDATE语句更新指定的列值 ...

    orcale常用命令

    如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:...

    数据库系统概论实验指导书.doc

    向输入表中的记录:(每个表最少5条记录,其中一条是与自己相关的真实记录) 1.7思考题: 1. 从用户角度看,数据库系统都有哪些体系结构? 2. 数据库管理系统通常由哪几部分组成? 3. 如何用SQL语句完成上述的工作? ...

    第一章数据库的简介.docx

    INSERT语句用于插入数据,UPDATE语句用于修改数据,DELETE语句用于删除数据。 (3)数据库查询语言(Data Query Language,DQL) 数据库查询语言主要用于查询语言,也就是指SELECT语句。 SELECT语句查询数据库中的一...

    Oraclet中的触发器

    行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它...

    数据库.txt

    INSERT语句用于插入数据,UPDATE语句用于修改数据,DELETE语句用于删除数据。 (3)数据库查询语言(Data Query Language,DQL) 数据库查询语言主要用于查询语言,也就是指SELECT语句。 SELECT语句查询数据库中的一...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速...

    mysql数据库的基本操作语法

    foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:检查,指定一个表达式,用于检验指定数据 MySQL不支持check约束,但可以使用check约束,而没有任何效果; 根据约束数据列限制,约束...

    400个DreamWeaver插件

    400个插件,下面的详细列表: mxp/ColdFusion中的Include mxp/80多个国家的一个下拉菜单,在某些时候...很多朋友一定都想不打开客户端的默认邮件程序来发送email吧,这个插件就是插入一个这样的超连接。适用于报告站

    oracle数据库经典题目

    7.如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用Select语句。 8.使用Describe命令可以显示表的结构信息。 9.使用SQL*Plus的Get命令可以将文件检索到缓冲区,并且不执行。 10.使用Save命令可以将...

    MysqlDLL,C#操作MYSQL数据库

    注意: ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时...

    2009达内SQL学习笔记

    检索返回数据的顺序没有特殊意义,为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。 ORDER BY 子句取一个或多个列的名字。 对空值,按无穷大处理(升序中,空值排最后;降序中排最前)。 1、...

    PL/SQL Developer8.04官网程序_keygen_汉化

     2 隐式游标 所有的隐式游标都被假设为只返回一条记录。 使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。  例如: ……. SELECT studentNo,studentName INTO curStudentNo...

    Asp Conn.execute的参数与返回值总结

    近期一个项目是将excel内容插到数据库中,插入以后要显示插入的数据条数,一直苦于没办法,后来研究execute发现这个方法是有返回参数的。 代码如下: CONN.EXECUTE(SQL,RowsAffected,C) 参数含义: SQL:值可以是SQL...

    PL/SQL 基础.doc

    5) 当数据被插入表中的时候,表所需的空间就被分配了; 6. 变量的作用域和可见性 <<outer>> 1) 执行块里可以嵌入执行块; 2) 里层执行块的变量对外层不可见; 3) 里层执行块对外层执行块变量的修改会影响外层块...

    PLSQLDeveloper下载

    即当一个对数据库的查询操作返回一组结果集时,用游标来标注这组结果集,以后通过对游标的操作来获取结果集中的数据信息。这里特别提出游标的概念,是因为它在PL/SQL的编程中非常的重要。定义游标的语法结构如下: ...

    最全的oracle常用命令大全.txt

    如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:...

Global site tag (gtag.js) - Google Analytics