论MySQL中如何代替Oracle中select into new_table from old_table

 v_receipt         warehouse_receipt%ROWTYPE;-- 这里创建表类型,v_receipt复刻了warehouse_receipt的类型(相当于拥有了所有相同的字段)

select * into v_receipt_detail from warehouse_receipt_detail d where d.receipt_detail_id = v_detailId;

**而在MySQL总无法用select into new_table from old_table这个语句**

但是MySQL中有temporary table这个临时表

如何复刻另一张表呢,语句来了

create temporary table new_table (select * from old_table)

这样就创建了一个新的临时表

drop table if exists temp_table;
create temporary table temp_table(select * from test_table);
select name from temp_table where id=2; -- 这句话同样能用

 

那么,为什么要用这种表变量和复刻的临时表呢?

其实这种临时表是动态的,在满足某种筛选条件下,产生的筛选出的主表

test_table

delimiter $$
-- drop table if exists temp_table;
create procedure temp_test()
begin
drop table if exists temp_table;
create temporary table temp_table(select * from test_table);
-- set @name=temp_table.name;
select name from temp_table where id=2;
end$$
delimiter

测试 

call temp_test()

结果

name

------

nyu-ploy

另保留一段代码

delimiter $$
drop procedure if exists test_at $$
create definer=root@localhost procedure test_at()
begin
declare i1 integer default 1;
set i1=i1+1;
set @i2=i2+1;
select i1,@i2;
end $$
delimiter;

 **但重点是在oracle 中,表类型可以直接引用字段,即

v_inventoryTotal warehouse_inventory_total%ROWTYPE

v_inventoryTotal.XXId可以直接用,特别是ROWTYPE的表只有一行时,此时引用字段就是一个值

但是对于临时表 temp_table不可以直接 '.id'同时实质表也不可以

在MySQL中引用字段都要起别名 ,这和对象的道理一样,所以想用其中的字段,只能这样

 

delimiter $$
drop procedure if exists temp_test $$
create definer=root@localhost procedure temp_test()
begin
declare i1 integer default 1;
drop table if exists temp_table;
create temporary table temp_table(select * from test_table t where t.id=2);
select name into @temp_table_name from temp_table;
select @temp_table_name;
end $$
delimiter;

call temp_test ,就有一个值出来 即nyu-poly

如果这里where t.id>2,就会报错:Result consisted of more than one row 即@temp_table_name不可以是多个值

 

 

 

posted @ 2013-12-15 18:04  Kstyjobx!!  阅读(3021)  评论(0编辑  收藏  举报