本文的目的是介绍Oracle一次查询将INSERT插入两个表的详细情况,特别关注oracle一次insert多条数据的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解O
本文的目的是介绍Oracle一次查询将INSERT插入两个表的详细情况,特别关注oracle一次insert多条数据的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Oracle一次查询将INSERT插入两个表的机会,同时也不会遗漏关于C++ unordered_set插入元素(insert插入元素)详解、InserttionSort插入排序、Mybatis结合Oracle的foreach insert批量插入报错!、oracle insert all 复合表插入的知识。
本文目录一览:- Oracle一次查询将INSERT插入两个表(oracle一次insert多条数据)
- C++ unordered_set插入元素(insert插入元素)详解
- InserttionSort插入排序
- Mybatis结合Oracle的foreach insert批量插入报错!
- oracle insert all 复合表插入
Oracle一次查询将INSERT插入两个表(oracle一次insert多条数据)
只是想知道是否可以在单个查询中为Oracle 11g对两个表运行INSERT?
我知道您可以执行INSERT ALL … SELECT查询,但是我需要在没有SELECT的情况下执行此操作,因为这是数据直接从XLS传入数据库。
理想情况下,我想要类似以下示例的内容:
INSERT INTO table1 t1, table2 t2 (t1.tid, t1.date, t1.title, t2.tid, t2.date, t2.user, t2.note)VALUES (1,''01-JAN-15'',''title'',1,''01-JAN-15'',''john'',''test note'');
有任何想法吗?
答案1
小编典典尝试使用from dual;
,如下所示:
INSERT ALLINTO table1 (tid, date, title) values (s_tid, s_date, s_title)INTO table2 (tid, date, user, note) values (s_tid, s_date, s_user, s_note)SELECT s_tid, s_date, s_title, s_user, s_noteFROM( SELECT 1 s_tid, ''01-JAN-15'' s_date, ''title'' s_title, ''john'' s_user, ''test note'' s_note FROM dual;)
C++ unordered_set插入元素(insert插入元素)详解
成员函数 insert() 可以插入作为参数传入的单个元素。在这种情况下,它会返回一个 pair 对象,这个 pair 对象包含一个迭代器,以及一个附加的布尔值用来说明插入是否成功。如果元素被插入,返回的迭代器会指向新元素;如果没有被插入,迭代器指向阻止插入的元素。可以用一个迭代器作为 insert() 的第一个参数,它指定了元素被插入的位置,如果忽略插入位置,在这种情况下,只会返回一个迭代器。另一个版本的 insert() 函数可以插入初始化表中的元素,在这种情况下,什么都没有返回。下面是一些说明性语句:
auto pr = words.insert("ninety"); // Returns a pair - an iterator & a bool value auto iter = words.insert (pr.first,"nine"); // 1st arg is a hint. Returns an iterator words.insert({"ten","seven","six"}); // Inserting an initializer list当调用 insert() 插入一段元素时,什么都不返回:
std::vector<string> more { "twenty","thirty","forty" }; words.insert(std::begin(more),std::end(more));//Insert elements from the vectorunordered_set 容器的成员函数 emplace() 和 emplace_hint() 可以在容器的适当位置创建元素。正如我们之前所见的 set 容器,传入 emplace() 的参数会被传入元素的构造函数,用来创建元素。emplace_hint() 的迭代器参数可以指定元素的插入位置,后面是构造元素需要的参数。例如:
std::unordered_set<std::pair<string,string>,Hash_pair> names; auto pr = names.emplace ("Jack","Jones") ; // Returns pair<iterator,bool> auto iter = names.emplace_hint (pr.first,"John","Smith"); // Returns an iterator容器的元素是用来表示名称的 pair 对象,这里的每个名称由两个 string 对象组成,它们分别表示一个人的姓和名。unordered_set<T> 元素默认的哈希函数是一个 hash<T> 类模板的实例。这个模板对基本类型、指针、string 对象有一些特例化的定义。
因为没有 hash<pair<string,string>> 模板的特性化定义,所以需要定义一个哈希函数来哈希元素。这里将它的类型指定为 -Hash_pair,它也是模板的第二个类型参数。emplace() 的姓名参数会被传入 pair 的构造函数中,emplace_hint() 使用了一个指向先前插入元素的迭代器,这一点可能会被忽略。后面的参数是 pair 构造函数的参数。函数对象类型 Hash_pair 可以用来对 names 容器中的元素进行哈希,可以按如下方式定义它:
class Hash_pair { public: size_t operator()(const std::pair<string,string>& pr) { return std::hash<string>()(pr.first + pr.second); } };这里使用了一个定义在 string 头文件中的 hash<string> 函数对象的实例。它会哈希一个由 pair 对象的第一个成员和第二个成员串联的字符串,然后将结果作为这个 pair 元素的哈希值返回。
InserttionSort插入排序
#include<iostream>
using namespace std;
int main()
{
int n ;
int A[] = {1,2,5,3,7,4};
n= sizeof(A)/sizeof(A[0]);
int key, j;
for (int i=1;i<n;i++)
{
key = A[i];
j = i-1;
while(j>=0 && key<A[j])
{
A[j+1] = A[j];
j--;
}
j++;
A[j]= key;
}
int i=0;
for( i=0;i<n-1;i++)
cout<<A[i]<<" ";
cout<<A[i]<<endl;
system("pause");
return 0;
}
插入排序的主要思想是,每次将数据全部排序好,对于要插入的数据,逐个从后向前比较,对于升序来讲,如果当前要插入的元素比比较位置的key小,那么将比较的元素向后移,直到不满足该条件,将数据插入,得到的依然是排序好的数组。该算法时间复杂度为O(n^2).
Mybatis结合Oracle的foreach insert批量插入报错!
最近做一个批量导入的需求,将多条记录批量插入数据库中。解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入。期间遇到了“SQL 命令未正确结束 ”的错误,最终解决,记录下来供以后查阅和学习。
首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下:
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map
然后,照葫芦画瓢写了如下的xml文件,
xxxMapper.xml文件:
<insert id="addSupCity" parameterType="java.util.List"> <selectKey keyProperty="cityId" order="BEFORE" resultType="String"> <![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]> </selectKey> INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES <foreach collection="list" item="item" index="index" separator=","> ( #{item.cityId,jdbcType=VARCHAR}, #{item.cityCode,jdbcType=VARCHAR}, #{item.cityName,jdbcType=VARCHAR}, #{item.areaDesc,jdbcType=VARCHAR}, #{item.supId,jdbcType=VARCHAR}, #{item.stat,jdbcType=VARCHAR} ) </foreach> </insert>
但是运行起来后就一直报错,报错信息如下:
### SQL: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?) ### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
把SQL复制出来在PL/SQL中运行也是报同样的错,如上也可以看出,使用批量插入执行的SQL语句等价于: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?),而在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的 。再回过头去看那篇文章,发现这是适用于MySQL的,不适用于Oracle,因此把xml文件修改一下:
<insert id="addSupCity" parameterType="java.util.List"> INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) SELECT SEQ_OCL_SUPCITY.NEXTVAL CITY_ID, A.* FROM( <foreach collection="list" item="item" index="index" separator="UNION ALL"> SELECT #{item.cityCode,jdbcType=VARCHAR} CITY_CODE, #{item.cityName,jdbcType=VARCHAR} CITY_NAME, #{item.areaDesc,jdbcType=VARCHAR} AREA_DESC, #{item.supId,jdbcType=VARCHAR} SUP_ID, #{item.stat,jdbcType=VARCHAR} STAT FROM dual </foreach> )A </insert>
运行通过。在Oracle的版本中,有几点需要注意的:
1.SQL中没有VALUES;
2.<foreach>标签中的(selece ..... from dual);
3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。
oracle insert all 复合表插入
insert all (复合表插入),是将一个查询结果同时插入多个表中的功能。使用insert all的好处是通过读取一次源表就可以插入多张目标表,减少重复读取的开销。
语法:
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause value_clause] (subquery);
conditional_insert_clause is:
[ALL] [FirsT]
[WHEN condition THEN] [insert_into_clause value_clause]
[ELSE] [insert_into_clause value_clause]
all:不考虑先后关系,只要满足条件,就全部插入;
first:考虑先后关系,如果有数据满足第一个when条件又满足第二个when条件,则执行第一个then插入语句,第二个then就不插入第一个then已经插入过的数据了。
其区别也可描述为,all只要满足条件,可能会作重复插入;first首先要满足条件,然后筛选,不做重复插入
示例:
insertall whenc1<1000thenintosamall_ordersvalues(oid,c1,sid,cid) whenc1<2000thenintomedium_ordersvalues(oid,cid) whenc1>2000andc1<2900thenintolarge_ordersvlaues(oid,cid) elseintospecial_orders selectoid,cid fromorders;
指定insert first 当第一个when条件成立时,执行该when条件后的语句,并且跳过后面的 WHEN 子句(后面的when语句都不再考虑满足第一个When子句的记录,即使该记录满足when语句中的条件)。
insertfirst whenc1<1000thenintosamall_ordersvalues(oid,cid fromorders;
上面两条语句区别在第二个when条件,insert all 中 第二个条件会插入orders 表中c1<2000的记录,insert first 中第二个when条件会插入orders表中1000<c1<2000的记录,insert first中插入第二个when子句中的表时排除了第一个when条件的记录,
我们今天的关于Oracle一次查询将INSERT插入两个表和oracle一次insert多条数据的分享已经告一段落,感谢您的关注,如果您想了解更多关于C++ unordered_set插入元素(insert插入元素)详解、InserttionSort插入排序、Mybatis结合Oracle的foreach insert批量插入报错!、oracle insert all 复合表插入的相关信息,请在本站查询。
本文标签: