SQL同时插入多张表

SQL同时插入多张表,第1张

通过事务来实现,也就是说,SqlCommand的CmdText属性在一个方法当中可以赋多个SQL语句

SqlConnection sqlConnection = new SqlConnection()

...初始化连接

// 开启事务

SqlTransaction sqlTransaction = sqlConnection.BeginTransaction()

// 将事务应用于Command

SqlCommand sqlCommand = new SqlCommand()

sqlCommand.Connection = sqlConnection

sqlCommand.Transaction = sqlTransaction

sqlCommand.CmdText=第一个sql语句

sqlCommand.ExcuteNoneQuery()

sqlCommand.CmdText=第二个sql语句

sqlCommand.ExcuteNoneQuert()

try

{

// 利用sqlcommand进行数据 *** 作

...

// 成功提交

sqlTransaction.Commit()

}

catch(Exception ex)

{

// 出错回滚

sqlTransaction.Rollback()

}

如果在执行第二次SQL语句是出错了,那么就会到Catch异常中,执行回滚,那么第一次执行的也同样回滚了,所以必须2个都一行成功才往数据库中提交

这里是用了2次SQL语句,如果你想用1个语句同时 *** 控2个表的话,就要用到存储过程或者是触发器,存储过程和触发器你如果想知道的话加QQ吧:312976625,我给你讲.

INSERT ALL是9i新增的语法,它扩充了原有的INSERT语句,使得INSERT语句从原来的只能插入到一张表发展到可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表中。

下面看几个简单的例子:

SQL>CREATE TABLE TABLE_STORAGE

2 (

3 TABLE_NAME VARCHAR2(30),

4 TABLESPACE_NAME VARCHAR2(30),

5 PCT_FREE NUMBER,

6 PCT_USED NUMBER,

7 INI_TRANS NUMBER,

8 MAX_TRANS NUMBER,

9 INITIAL_EXTENT NUMBER,

10 NEXT_EXTENT NUMBER,

11 MIN_EXTENTS NUMBER,

12 MAX_EXTENTS NUMBER,

13 PCT_INCREASE NUMBER,

14 FREELISTS NUMBER,

15 FREELIST_GROUPS NUMBER

16 )

表已创建

SQL>CREATE TABLE TABLE_STAT

2 (

3 TABLE_NAME VARCHAR2(30),

4 NUM_ROWS NUMBER,

5 BLOCKS NUMBER,

6 EMPTY_BLOCKS NUMBER,

7 AVG_SPACE NUMBER,

8 CHAIN_CNT NUMBER,

9 AVG_ROW_LEN NUMBER

10 )

表已创建。

SQL>INSERT ALL

2 INTO TABLE_STORAGE VALUES (TABLE_NAME, TABLESPACE_NAME, PCT_FREE, PCT_USED,

3 INI_TRANS, MAX_TRANS, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,

4 PCT_INCREASE, FREELISTS, FREELIST_GROUPS)

5 INTO TABLE_STAT VALUES (TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE,

6 CHAIN_CNT, AVG_ROW_LEN)

7 SELECT * FROM USER_TABLES

已创建54行。

SQL>SELECT COUNT(*) FROM TABLE_STORAGE

COUNT(*)

----------

27

SQL>SELECT COUNT(*) FROM TABLE_STAT

COUNT(*)

----------

27

SQL>SELECT COUNT(*) FROM USER_TABLES

COUNT(*)

----------

27

SQL>DROP TABLE TABLE_STAT

表已丢弃。

SQL>DROP TABLE TABLE_STORAGE

表已丢弃。

上面是最简单的INSERT ALL语句的实现,下面看看带条件的INSERT ALL语句。

SQL>CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30))

表已创建。

SQL>CREATE TABLE INDEX_ALL (INDEX_NAME VARCHAR2(30))

表已创建。

SQL>CREATE TABLE OBJECT_OTHER (OBJECT_NAME VARCHAR2(30), OBJECT_TYPE VARCHAR2(30))

表已创建。

SQL>INSERT ALL

2 WHEN (OBJECT_TYPE = 'TABLE') THEN

3 INTO TABLE_ALL VALUES (OBJECT_NAME)

4 WHEN (OBJECT_TYPE = 'INDEX') THEN

5 INTO INDEX_ALL VALUES (OBJECT_NAME)

6 ELSE

7 INTO OBJECT_OTHER

8 SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS

9

已创建91行。

SQL>SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'

COUNT(*)

----------

27

SQL>SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX'

COUNT(*)

----------

14

SQL>SELECT COUNT(*) FROM USER_OBJECTS

2 WHERE OBJECT_TYPE NOT IN ('TABLE', 'INDEX')

COUNT(*)

----------

50

SQL>SELECT COUNT(*) FROM TABLE_ALL

COUNT(*)

----------

27

SQL>SELECT COUNT(*) FROM INDEX_ALL

COUNT(*)

----------

14

SQL>SELECT COUNT(*) FROM OBJECT_OTHER

COUNT(*)

----------

50

SQL>DROP TABLE TABLE_ALL

表已丢弃。

SQL>DROP TABLE INDEX_ALL

表已丢弃。

SQL>DROP TABLE OBJECT_OTHER

表已丢弃。

下面看一下INSERT ALL和INSERT FIRST的区别:

SQL>CREATE TABLE TABLESPACE_USERS (NAME VARCHAR2(30), TYPE VARCHAR2(30))

表已创建。

SQL>CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30))

表已创建。

SQL>INSERT ALL

2 WHEN (SEGMENT_TYPE = 'TABLE') THEN

3 INTO TABLE_ALL VALUES (SEGMENT_NAME)

4 WHEN (TABLESPACE_NAME = 'USERS') THEN

5 INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)

6 SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME

7 FROM USER_SEGMENTS

已创建69行。

SQL>SELECT COUNT(*) FROM TABLE_ALL

COUNT(*)

----------

21

SQL>SELECT COUNT(*) FROM TABLESPACE_USERS

COUNT(*)

----------

48

SQL>SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE'

COUNT(*)

----------

18

SQL>TRUNCATE TABLE TABLE_ALL

表已截掉。

SQL>TRUNCATE TABLE TABLESPACE_USERS

表已截掉。

SQL>INSERT FIRST

2 WHEN (SEGMENT_TYPE = 'TABLE') THEN

3 INTO TABLE_ALL VALUES (SEGMENT_NAME)

4 WHEN (TABLESPACE_NAME = 'USERS') THEN

5 INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)

6 SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME

7 FROM USER_SEGMENTS

已创建51行。

SQL>SELECT COUNT(*) FROM TABLE_ALL

COUNT(*)

----------

21

SQL>SELECT COUNT(*) FROM TABLESPACE_USERS

COUNT(*)

----------

30

SQL>SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE'

COUNT(*)

----------

0

最后看一下多表插入语句的限制条件:

只能对表执行多表插入语句,不能对视图或物化视图执行;

不能对远端表执行多表插入语句;

不能使用表集合表达式;

不能超过999个目标列;

在RAC环境中或目标表是索引组织表或目标表上建有BITMAP索引时,多表插入语句不能并行执行;

多表插入语句不支持执行计划稳定性;

多表插入语句中的子查询不能使用序列。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11862470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存