--创建用户
CREATE USER jim IDENTIFIED BY changeit; --给用户赋登陆连接权限
GRANT CONNECT TO jim; --给用户赋资源权限
GRANT RESOURCE TO jim; --回收登陆权限
REVOKE CONNECT FROM jim; --回收资源操作权限
REVOKE RESOURCE FROM jim; --锁定用户
ALTER USER jim ACCOUNT LOCK; --给用户解锁
ALTER USER jim ACCOUNT UNLOCK; --给用户修改密码
ALTER USER jim IDENTIFIED BY changeit; --创建时间维度表
CREATE TABLE DIM_DATE(
Date_ID char(8) primary key , --
Date_Name date, --2016/7/4
Year number, --
Year_Half char(6), --2016H2
Year_Month char(6), --
Year_Quarter char(6),-- 2016Q3
Half_Number number,--
Half_Name char(2), --H2
Quarter_Number number,--
Quarter_Name char(2),--Q3
Month_Number number,--
Month_Name nvarchar2(20),--JUNL
Week_Number number, --
Week_Name nvarchar2(20),--Monday
Creat_Date date, --创建时间
Update_Date date) --更新时间
; --测试选出一段时间
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD')); with
temp_date as (
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
)
select * from temp_date;
--创建存储过程,导入时间
CREATE OR REPLACE PROCEDURE SP_ADD_DATE
AS
v_Half number;
v_Quarter number;
v_Month DIM_Date.Month_Name%type;
v_Month_Number number;
CURSOR c_date IS
SELECT Date_ID,DIM_Date.Date_Name FROM DIM_DATE;
c_row c_date%rowtype;
BEGIN
MERGE INTO DIM_DATE T1
USING(
select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) date_name from dual
connect by rownum<=(to_date('2018-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
) temp_Date
on (t1.date_name=temp_Date.date_name)
when matched then
update set t1.date_id=to_char(temp_Date.date_name,'YYYYMMDD')
when not matched then
insert (Date_ID) values(to_char(temp_Date.date_name,'YYYYMMDD'));
--循环游标
FOR c_row in c_date loop
v_Month_Number:=to_number(to_char(c_row.Date_Name,'MM'));
if v_Month_Number>6 then
v_Half:=2;
else
v_Half:=1;
end if;
update DIM_DATE set
DIM_DATE.DATE_NAME=to_date(c_row.Date_ID,'YYYY-MM-DD'),
DIM_DATE.HALF_NAME='H'||v_Half --后面在这里补充
where DIM_DATE.DATE_ID=c_row.Date_ID;
end loop;
END;
 /*******************华丽的分割线********************/
--创建地域维度表
CREATE TABLE DIM_Geo(
M_CNTY_ID number primary key,
M_CNTY nvarchar2(20), --县
M_CITY nvarchar2(20), --市
M_PRVNC nvarchar2(20)--省
); --创建销售事实表
CREATE TABLE SALES_FACT(
EMPNO NUMBER(4),
DATE_ID char(8),
CITY_ID NUMBER,
SALES NUMBER); --基于多列的联合主键
--此处为empno,date_ID, city_ID共同为一个主键
alter table SALES_FACT add constraint PK_SALES_FACT
PRIMARY KEY (EMPNO,DATE_ID,CITY_ID); --查询出事实表
WITH
v1 as (select * from SALES_FACT),
v2 as (select * from EMP),
v3 as (select * from DIM_DATE),
v9 as (select * from DIM_Geo),
v6 as (select distinct sales_fact.city_id from sales_fact),
v4 as(SELECT v2.ename,v1.date_id,v1.city_id,v1.sales FROM v1 right join v2
on v2.empno=v1.empno),
v5 as (select v4.ename,v3.date_id,v4.city_id,v4.sales from v4 partition by (v4.ename)
right join v3 on v3.date_id=v4.date_id),
v7 as (select v5.ename,v5.date_id,v6.city_id,v5.sales from v5 partition by (ename,date_id)
right join v6 on v6.city_id=v5.city_id),
v8 as (select v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.Month_Number,v3.MONTH_NAME,v3.Week_Name,v7.city_id,v7.sales from v7 left join v3
on v7.date_id=v3.date_id group by v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.MONTH_NAME,v3.Month_Number,v3.Week_Name,v7.city_id,v7.sales
order by v7.ename,v3.Quarter_Name,v3.Week_Name)
select ename,month_name,v9.M_CNTY,v9.M_CITY,v9.M_PRVNC,sum(sales) from v8
left join v9 on v8.city_id=v9.M_CNTY_ID WHERE ENAME='ADAMS' GROUP BY ename,month_name,v9.M_CNTY,
v9.M_CITY,v9.M_PRVNC ORDER BY MONTH_NAME,M_CNTY ;

Oracle中几个类似集合的用法

union all:将多个选择结果取并集,并且包含重复部分

unional:将

intersect:

minus:

Oracle拆分字段

如有下数据:我们需要将表格1中的数据形式转换成表格2的形式(也就是将老师这个字段拆成单行)

表1                                                                                                                                                                      表2

姓名 学科 老师
Jim 语文 张三 李四 王五
Jim 数学 牛儿 
Jim 英语 迈克尔 梁山伯
Lucy 语文 老五 李四
姓名 学科 老师
Jim 语文 张三
Jim 语文 李四
Jim 语文 王五
Jim 数学 牛儿
Jim 英语 麦克尔
Jim 英语 梁山伯
Lucy 语文 老五
Lucy 语文 李四

此处的核心问题就是:需要将一条数据拆成多条数据

在解决这个问题之前,我们先来看看一个例子

regexp_substr函数的使用方法:

function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

String :需要进行正则处理的字符串

__pattern    :进行匹配的正则表达式
__position   :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier   :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
connect by 函数
 
 
select regexp_substr('ABCD EF G','[^ ]+',1,level,'c') from dual
connect by regexp_substr('ABCD EF G','[^ ]+',1,level,'c') is not null ;

这时候,我们得到的结果是:

同样的道理,我们来实现一开始的问题,先创建这么一张关系表:

CREATE TABLE t (
student nvarchar2(20),
subject nvarchar2(10),
teacher nvarchar2(100)
); INSERT INTO t VALUES('Jim','语文','张三 李四 王五');
INSERT INTO t VALUES('Jim','数学','牛儿');
INSERT INTO t VALUES('Jim','英语','迈克尔 梁山伯');
INSERT INTO t VALUES('Lucy','语文','老五 李四');

接下来,我们实现对teacher这个字段进行拆分,teacher中的每个值是按照空格分开的。

我们实现的代码是这样的:

select student,subject,regexp_substr(teacher,'[^ ]+',1,level) from t
group by student,subject , teacher,level
connect by regexp_substr(teacher,'[^ ]+',1,level) is not null order by 1;

最终结果:

此外,我们还有另外一种方法可以来解决这个问题,前提是我们需要把所有的teacher找出来做一个临时表,

利用like方法以及左连接来拆分

select
t.student
,t.subject
,teacherRecord.teacher
from t left outer join teacherRecord
on t.teacher like '%' || teacherRecord.teacher || '%'

最终结果:

orcle数据库表导出csv文件

废话少说,直接来代码:

set colsep ,
set feedback off
set heading off
set trimout on
spool D:\DBoracle\lfc.csv
select '"' || yyyymm || '","' || yyyymmdd || '","' || bu_cd || '"from jim_CALL;
spool off
exit

  

Oracle基本函数即字段拆分的更多相关文章

  1. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  2. Oracle数据库BLOB字段的存取

    述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cur ...

  3. java 存储oracle的clob字段

    项目中有很长的字符创需要存储,用到了oracle的clob字段,直接很长的字符串插入到clob字段中会报字符过长的异常,于是便寻求解决方案.看到这个博客写的还不错 首先,创建一个含CLOB字段的表: ...

  4. 解决比较Oracle中CLOB字段问题

    解决比较Oracle中CLOB字段问题   Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...

  5. sybase数据库和oracle数据库中字段中含有换行符的解决办法

    最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...

  6. Oracle 批量修改字段长度

    Oracle 批量修改字段长度 SELECT  'alter table '||a.table_name||' MODIFY  '||A.COLUMN_NAME||' VARCHAR2(100);' ...

  7. oracle数据库调整字段顺序

    oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034

  8. sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新

    将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...

  9. oracle删除表字段和oracle表增加字段

    这篇文章主要介绍了oracle表增加字段.删除表字段修改表字段的使用方法,大家参考使用吧   添加字段的语法:alter table tablename add (column datatype [d ...

随机推荐

  1. C++11 引用叠加规则和模板参数类型推导规则

    http://zm8.sm-img2.com/?src=http%3A%2F%2F***%2FArticle%2F38320&uid=57422b713ac761e653af7b327bfd9 ...

  2. Adobe Flash 无法正常使用

    如果 Adobe Flash 无法正常使用,或者您看到以下错误消息,请尝试按照下文介绍的问题排查步骤操作. Adobe Flash 版本太旧,因此已被屏蔽无法加载插件该网页已屏蔽以下插件如果您使用的是 ...

  3. svn 撤销修改

    1,更新到最新版本 不知道是哪个文件的问题时,可以svn log查看日志,基本上可以通过哪一次提交修改了哪一个文件推算出 是哪个文件的问题. 若知道是哪个文件的问题,直接svn log 文件名 大致确 ...

  4. Howto Reboot or halt Linux system in emergency (ZT)

    http://www.cyberciti.biz/tips/reboot-or-halt-linux-system-in-emergency.html Linux kernel includes ma ...

  5. jdbcTemplate学习(三)

    上一节讲的查询方法,映射结果集为对象时,需要一个个set属性值,比较麻烦,下面讲解使用BeanPropertyRowMapper来将查询结果简单映射成对象: 使用Spring的JdbcTemplate ...

  6. pipeline(管道的连续应用)

    # -*- coding: utf-8 -*- """ Created on Tue Aug 09 22:55:06 2016 @author: Administrato ...

  7. ubuntu系统里vi编辑器时,按方向箭头输入是乱码的ABCD字母?(图文详解)

    不多说,直接上干货! 问题详情 ubuntu系统里vi编辑器时,按方向箭头输入是乱码的ABCD字母?  解决办法 是由于预装的vim软件没更新,运行   sudo apt-get install vi ...

  8. MySQL 删除字段数据某关键字后的所有数据

    ),'开发商') WHERE Compay LIKE '%开发商%'; sql附上

  9. os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息

    import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...

  10. String/StringBuilder 类 用对象数组实现登录注册功能

    一.需求说明:实现用户注册.登陆功能: 程序中使用一个长度为3的对象数组,存储用户的登录名和密码: 例如如下格式: 登录名    密码      生日           爱好 zhangsan 11 ...