GVKun编程网logo

Oracle一次查询将INSERT插入两个表(oracle一次insert多条数据)

7

本文的目的是介绍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多条数据)

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插入元素)详解

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 vector
unordered_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插入排序

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批量插入报错!

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 复合表插入

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 复合表插入的相关信息,请在本站查询。

本文标签: