当前位置: 代码迷 >> Sybase >> sybase与oracle中insert into select跟select into的用法
  详细解决方案

sybase与oracle中insert into select跟select into的用法

热度:1007   发布时间:2016-05-05 09:15:35.0
sybase与oracle中insert into select和select into的用法

Sybase
在使用数据库的时候,有时我们需要把一个表中的数据经过筛选插入另外一个表中。

?

Sybase提供一种特殊的方式来实现这一功能,

?

一、首先,我们来看一下insert into select语句

其语法形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

这里的要求就是Table2必须已经存在,如果不存在,系统则会提示对象无效。?

例如
insert into boy
select id,name
from person
where type='boy'
通过insert .... select ...语句,select的结果会被直接插入表boy中,并且每个插入操作都会被记录到事务日志之中。

????

二、Sybase还提供了一种"select ... into"语句实现类似功能
select into from 语句,该语法形式为:SELECT value1, value2 into Table2 from Table1。

这里要求的是MyTable1不存在,因为在插入的时候,系统会自动创建MyTable1,如果之前MyTable1已经被创建,执行时会报错,系统就会提示已经存在表

?????? 就是因为这个特性,就会给我们带来很多的方便,首先,我如果只想要MyTable2表中的ID列的话那我只需要将ID列select出来,然后加入到新表中即可。那如果我想要MyTable2中的Name列,那我也仅仅是需要把Name列select出来,然后添加到新表中即可。

应用范围由实践者自己找到答案

例如,
select id,name
into boy

from person
where type='boy'
这时一个拥有字段id和name的表boy会被自动创建,select的结果会被直接插入新建的表中,
但操作并不会被记录到事务日志,并且select..into只有在事务日志trun off 之后方可使用


用sybase central查看sa用户的权限,在“选项”中,select into及bcp等选项已经打开。
select * from kkk into #tmpkkk怎么就不行呢?试了试,原来是select * into #tmpkkk from kkk,晕倒
当然如果insert into #tmpkkk select * from kkk,就需要先创建#tmpkkk了。
若将以上语句在存储过程中执行时,需:
declare @str varchar(200)
select @str="select * into tempdb..kkk from kzzz"
exec (@str)
[email protected],不然会报错。

=============================================================================


Oracle中insert into select和select into的用法(异常0RA-00905:missing keyword的解决)
两张表进行数据的拷贝,最常用的拷贝语句是:

insert into select? 和 select into from
但是请绝对的注意:
在Oracle中select into from不可以使用-----

原因很简单:select into是PL/SQL language 的赋值语句!如果使用则Oracle会抛出0RA-00905:missing keyword的异常!
但是可以用create table select代替该功能!!!具体参考下面测试代码!
但是在Sql Server中可以正常使用。
先做个小测试:

-- 建表
create table test1(
id number primary key,
testname varchar2(20),
createtime date,
falg varchar2(10)
);

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

-- 插入测试数据
insert into test1 values(1,'测试数据1....1',sysdate-2,'N');
insert into test1 values(2,'测试数据1....2',sysdate-2,'N');
insert into test1 values(3,'测试数据1....3',sysdate-2,'N');
commit;
-- 使用insert into select 拷贝数据(注意红色部分,可以自动生成id序列值)
insert into test2(id,testname,createtime,falg)
?? select seq_test.nextval,t1.testname,t1.createtime,t1.falg from test1 t1;
-- 使用 create table select 创建被拷贝数据(注意要删除test2表先)
create table test2 as select t1.id,t1.testname,t1.createtime,t1.falg from test1 t1;

-- select into from 不可以,抛异常
select t1.id,t1.testname,t1.createtime,t1.falg into test2(id,testname,createtime,falg)
?? from test1 t1;

-- PL/SQL language 中select into赋值语句的测试使用
create or replace procedure test1_prod
is
? aa varchar2(100);
begin
? select t1.testname into aa from test1 t1 where id=1;
? dbms_output.put_line('t1.testname= '|| aa);
end;

总结:
数据拷贝,建议使用insert? into? select;
使用insert? into? select时如果对拷贝表生成id序列值,需要在select中以查询出的形式从sequence中查询出,再插入拷贝表;比如:
insert into test2(id,testname,createtime,falg)
?? select seq_test.nextval,t1.testname,t1.createtime,t1.falg from test1 t1;
典型从test1表查询出数据插入test2表,test2要自动插入id,看上面代码,id要在select中先从sequence中查询出了!!

  相关解决方案