多维表格转换。

----1 需要用到的表:

-- Create table---转换后的表
create table GDP_PROVINCE_TURN
(
时间 NUMBER,
行业代码 VARCHAR2(50),
XX省 VARCHAR2(50),
第一产业 VARCHAR2(50),
第二产业 VARCHAR2(50),
第三产业 VARCHAR2(50),
行业名称 VARCHAR2(50),
GDP值 VARCHAR2(50)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
next 1
minextents 1
maxextents unlimited
);

------ Create table----转换前的表
create table GDP_PROVINCE
(
时间 NUMBER,
XX省 VARCHAR2(20),
第一产业 VARCHAR2(20),
第二产业 VARCHAR2(20),
第三产业 VARCHAR2(20),
采矿业 VARCHAR2(20),
制造业 VARCHAR2(20),
电力燃气及水的生产和供应业 VARCHAR2(20),
建筑业 VARCHAR2(20),
交通运输仓储和邮政业 VARCHAR2(20),
信息传输计算机服务和软件业 VARCHAR2(20),
批发和零售业 VARCHAR2(20),
住宿和餐饮业 VARCHAR2(20),
金融业 VARCHAR2(20),
房地产业 VARCHAR2(20),
租赁和商务服务业 VARCHAR2(20),
科学研究技术服务和地质勘查业 VARCHAR2(20),
水利环境和公共设施管理业 VARCHAR2(20),
居民服务和其他服务业 VARCHAR2(20),
教育 VARCHAR2(20),
卫生社会保障和社会福利业 VARCHAR2(20),
文化体育和娱乐业 VARCHAR2(20),
公共管理和社会组织 VARCHAR2(20),
其他行业 VARCHAR2(20)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
next 1
minextents 1
maxextents unlimited
);


---------2. 存储过程:

CREATE OR REPLACE PROCEDURE pr_turn20110820(v_colname varchar2) is
v_colname2 varchar2(20);
v_time varchar2(20);
sqlStr varchar2(1000);
sqlStr2 varchar2(1000);
---define cursor type name
type cur_type is ref cursor;
c_table cur_type;

begin
---sqlStr待时间查询。
sqlStr:='SELECT 时间,'||v_colname||'
FROM (select 时间,XX省,
第一产业,
第二产业,
第三产业,
采矿业,
制造业,
''电力、燃气及水的生产和供应业'',
建筑业,
''交通运输、仓储和邮政业'',
''信息传输、计算机服务和软件业'',
批发和零售业,
住宿和餐饮业,
金融业,
房地产业,
租赁和商务服务业,
''科学研究、技术服务和地质勘查业'',
''水利、环境和公共设施管理业'',
居民服务和其他服务业,
教育,
''卫生、社会保障和社会福利业'',
''文化、体育和娱乐业'',
公共管理和社会组织,
其他行业
from GDP_PROVINCE)
UNPIVOT('||v_colname||' FOR 行业名称 IN
('||v_colname||'))';
---不带时间的sql查询
sqlStr2:='SELECT '||v_colname||'

FROM (select 时间,XX省,
第一产业,
第二产业,
第三产业,
采矿业,
制造业,
''电力、燃气及水的生产和供应业'',
建筑业,
''交通运输、仓储和邮政业'',
''信息传输、计算机服务和软件业'',
批发和零售业,
住宿和餐饮业,
金融业,
房地产业,
租赁和商务服务业,
''科学研究、技术服务和地质勘查业'',
''水利、环境和公共设施管理业'',
居民服务和其他服务业,
教育,
''卫生、社会保障和社会福利业'',
''文化、体育和娱乐业'',
公共管理和社会组织,
其他行业
from GDP_PROVINCE)
UNPIVOT('||v_colname||' FOR 行业名称 IN
('||v_colname||'))';

open c_table for sqlStr ;
loop--对table_time表中数据循环
fetch c_table into v_time,v_colname2;
if c_table%found then
execute immediate 'update GDP_PROVINCE_TURN set '||v_colname||'=('||sqlStr2||' where 时间='||v_time||') where 时间='||v_time;
else exit;
end if;
end loop;
end pr_turn20110820;


/*

输入参数:为“XX省”,“第一产业”,“第二产业”等,

实现功能:可以实现把原表中的数据插入到新表中相应列中。

说明:GDP值 可以不用存储过程完成,直接转换到新表中。

完成时间:2011-08-15

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值