Oracle中insert into select和select into的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中insert into select和select into的区别相关的知识,希望对你有一定的参考价值。

insert into select可以将select 出来的N行(0到任意数)结果集复制一个新表中,select into
from只能将"一行"结果复制到一个变量中。这样说吧,select into是PL/SQL language
的赋值语句。而前者是标准的SQL语句。

做一个测试看两者差别。

首先创建两个表,一个作为源表,一个作为目标表。

create table t_source(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);

create table t_target(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);

接着,插入测试数据

insert into t_source values(1,\'测试数据1....1\',sysdate-2,\'N\');
insert into t_source values(2,\'测试数据1....2\',sysdate-2,\'N\');
insert into t_source values(3,\'测试数据1....3\',sysdate-2,\'N\');
commit;

测试insert into select 操作

insert into test2 select * from t_source where id=1;
commit;

测试select into 操作
因为select into是一个plsql语言中的复制语句,和:=实现的目标一样。

create or replace procedure sp_sync_test is
aa varchar2(100);
v_record t_source%rowtype;
begin
select t1.testname into aa from t_source t1 where id = 1;
dbms_output.put_line(\'普通变量 t1.testname= \' || aa);

select t1.* into v_record from t_source t1 where id = 1;
dbms_output.put_line(\'记录变量 t1.testname= \' || v_record.testname);

end;

这里增加了原始类型的变量和记录类型的变量
参考技术A Oracle中insert into select和select into的区别:
select into 就相当于赋值语句,insert into是复制语句。
在Oracle中,将一张表的数据复制到另外一个对象中。通常会有这两种方法:insert into select 和 select into from。
下面这个例子可以直观显示出二者的区别:
select * into target_table from source_table;
insert into target_table(column1,column2) select column1,5 from source_table;
以上两句都是将源表source_table的记录插入到目标表target_table,但两句又有区别。
第一句(select into from)要求目标表target_table不存在,因为在插入时会自动创建。
第二句(insert into select from)要求目标表target_table存在,由于目标表已经存在,
所以我们除了插入源表source_table的字段外,还可以插入常量,
把一张旧表里的字段复制到另外一张新表中.可以这样写sql语句
select * into 新表 from 旧表 where 新表.id=旧表.id
参考技术B 1.INSERT INTO SELECT语句
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
或者:Insert into Table2 select * from Table1
注意:(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
+ expand sourceview plaincopy to clipboardprint

--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10)
)
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int
)

--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

select * from Table2

--3.INSERT INTO SELECT语句复制表数据部分列和常值

Insert into Table2(a, c, d) select a,c,5 from Table1
或:Insert into Table2 select * from Table1
--4.显示更新后的结果

select * from Table2

--5.删除测试表
drop TABLE Table1
drop TABLE Table2

2.SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:
view plaincopy to clipboardprint?
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10)
)

--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1

--4.显示更新后的结果
select * from Table2

--5.删除测试表
drop TABLE Table1
drop TABLE Table2
参考技术C insert into 表名1 select 表名2:表示从表2查询数据赛到表1中
select 字段1 into 字段2 from 表名1:表示从表1中查询字段1插到临时变量字段2中
参考技术D insert into select
是SQL文,直接在sqlplus里就可以执行。

select into
是PL/SQL中的语法,需要放在PL/SQL的逻辑块中才能被识别执行。

以上是关于Oracle中insert into select和select into的区别的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中insert into select和select into的区别

oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

Oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

请问两个oracle数据库,用insert into 学生 select * from 学生 @dblink。发现学生表里面的有一个字段。

insert into语句的语法错误

oracle中select缺少into?