有多种实现方式:
wmsys.wm_concat函数
也可以用decode函数实现.
11g可以 使用pivot
存储过程实现
eg:
我现在的表如下:
产品名称 销售额 季度
奶酪 50 第一季度
奶酪 60 第二季度
啤酒 50 第二季度
啤酒 80 第四季度
。。。
。。。
想转换成如下格式
产品名称 第一季度销售额 第二季度销售额 第三季度销售额 第四季度销售额
奶酪 50 60 0 0
啤酒 0 50 0 80
答案:
01.最佳答案oracle下可以用函数decode处理:
02.
03.select 产品名称,
04.sum(decode(季度,'第一季度',销售额,0)) 第一季度销售额,
05.sum(decode(季度,'第二季度',销售额,0)) 第二季度销售额,
06.sum(decode(季度,'第三季度',销售额,0)) 第三季度销售额,
07.sum(decode(季度,'第四季度',销售额,0)) 第四季度销售额,
08.from 表名
09.group by 产品名称;
或者:
select 产品名称, wmsys.wm_concat(第一季度销售额),wmsys.wm_concat(第二季度销售额),wmsys.wm_concat(第三季度销售额),wmsys.wm_concat(第四季度销售额) from test group by 产品名称
其他方式大家自己去研究.
下次会谈一下行转列的问题.
首先我在mysql的test数据库里定义了一个student表:
create table student4(
id int primary key,
sanme char(5)
);
插入几个数据做测试用:
inset into student values(1,'mayi');
inset into student values(2,'mayi');
inset into student values(3,'mayi');
建立存储过程:
in 型:
delimiter //
create procedure demo_in(in p_in int)
begin
select p_in;
set p_in=2;
select p_in;
end;
//
delimiter ;
java测试代码:
CallableStatement callstatement = conn.prepareCall("call demo_in(?)");//conn,数据库连接
callstatement.setInt(1, 1);//设置第一个参数
callstatement.execute();//执行
conn.close();//关闭连接
out型:
delimiter //
create procedure demo_out(out s int)
begin
select count(*) into s from student;
end
//
delimiter ;
java测试代码:
CallableStatement callstatement = conn.prepareCall("call demo_out(?)");
callstatement.registerOutParameter(1, java.sql.Types.INTEGER);//注册存储过程的out型参数类型;使用之前必须注册;
callstatement.execute();//执行
System.out.println(callstatement.getInt(1));//获得存储过程的输出参数
conn.close();//关闭连接
总结: 先在数据库中建立存储过程,然后获得数据库连接conn后,生成CallableStatement对象,执行相应的操作。
看过的几篇文章:保留下来,下次记忆模糊了,在复习一下!
Java对存储过程的调用方法
java执行存储过程
闪回删除表(dropped tables):
语法:FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
在Oracle 10g中,Flash back家族分为以下成员:
Flashback Database
Flashback Drop
Flashback Table
Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query)
下面介绍一下Flashback Drop
Flashback Drop 是从Oracle 10g 开始出现的, 用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站非常类似。这个功能和数据库闪回没有关系,和flashback参数没有关系,表也不要求row movement.Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时,show recyclebin 为空。
1. Tablespace Recycle Bin
从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。
SQL> show user
USER is "HR"
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
禁用该功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;
禁用后删除的对象将直接删除,不会写到recyclebin中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。
表空间的Recycle Bin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。也可以手动的删除Recycle Bin占用的空间。
1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin中指定用户的对象
3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象
4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
5). Drop table table_name purge: 删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。
下面是Flashback Drop 实例操作,我用的HR用户登陆的,注意我的hr是拥有DBA角色的权限的。
实验一:
此时我 SQL> show recyclebin里面空的,即没有被drop的表。
创建一个测试表
SQL> create table emp as select * from employees;
Table created.
为测试表创建一个主键索引
SQL> alter table emp add constraint EMP_EMP_ID_PK_TEST primary key(employee_id);
Table altered.
查看一下该表的存储信息。
SQL> select file_id,block_id,blocks from dba_extents where segment_name='EMP' and owner='HR';
FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
4 385 8
我drop了emp表,recyclebin里有EMP备删除的信息了。
SQL> drop table emp;
Table dropped.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP BIN$0fkSqpkZFT/gQKjAyFwRDA==$0 TABLE 2012-12-29:15:00:01
SQL> select segment_name,blocks from user_segments where segment_name='BIN$0fkSqpkZFT/gQKjAyFwRDA==$0';
SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
BIN$0fkSqpkZFT/gQKjAyFwRDA==$0 8
EMP表被drop后,从下面的信息可以看出他的空间是被释放了。
SQL> select * from dba_free_space where file_id=4 and block_id=385;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
USERS 4 385 65536 8 4
闪回删除表
SQL> flashback table emp to before drop;
Flashback complete.
recyclebin没有了信息
SQL> show recyclebin
EMP表成功闪回
SQL> select count(*) from emp;
COUNT(*)
----------
107
从下面可以看出主键所有页是被闪回了,只是名字没有更改
SQL> select index_name from user_indexes where table_name='EMP';
INDEX_NAME
------------------------------
BIN$0fkSqpkYFT/gQKjAyFwRDA==$0
SQL> alter index "BIN$0fkSqpkYFT/gQKjAyFwRDA==$0" rename to "EMP_EMP_ID_PK_TEST";
Index altered.
再次查看,名字改过来了,一切和一开始一样了。
SQL> select index_name from user_indexes where table_name='EMP';
INDEX_NAME
------------------------------
EMP_EMP_ID_PK_TEST
实验二:
下面在以T表为例子来演示:
如果一个表被drop后,有重新建立了一个同名的表,如果再想闪回被删除的表,此时就需要重命名。
SQL> create table T as select * from employees;
Table created.
SQL> drop table T;
Table dropped.
SQL> create table T as select * from employees;
Table created.
出错了,系统提示该表名已经存在,所以需要重新给个名字闪回即可
SQL> flashback table T to before drop;
flashback table T to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
SQL> flashback table T to before drop rename to T2;
Flashback complete.
SQL> select count(*) from T2;
COUNT(*)
----------
107
实验三:
如果一个表被drop掉了,而且还在recyclebin里,则我们可以直接对recyclebin里的表做如下操作:
SQL> drop table T;
Table dropped.
SQL> set linesize 180
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$0fkSqpkqFT/gQKjAyFwRDA==$0 TABLE 2012-12-29:15:21:40
可以直接通过如下查询表信息
SQL> select count(*) from "BIN$0fkSqpkqFT/gQKjAyFwRDA==$0";
COUNT(*)
----------
107
可以直接查看表的结构
SQL> desc "BIN$0fkSqp