1. --创建用户
  2. CREATE USER jim IDENTIFIED BY changeit;
  3.  
  4. --给用户赋登陆连接权限
  5. GRANT CONNECT TO jim;
  6.  
  7. --给用户赋资源权限
  8. GRANT RESOURCE TO jim;
  9.  
  10. --回收登陆权限
  11. REVOKE CONNECT FROM jim;
  12.  
  13. --回收资源操作权限
  14. REVOKE RESOURCE FROM jim;
  15.  
  16. --锁定用户
  17. ALTER USER jim ACCOUNT LOCK;
  18.  
  19. --给用户解锁
  20. ALTER USER jim ACCOUNT UNLOCK;
  21.  
  22. --给用户修改密码
  23. ALTER USER jim IDENTIFIED BY changeit;
  24.  
  25. --创建时间维度表
  26. CREATE TABLE DIM_DATE(
  27. Date_ID char(8) primary key , --
  28. Date_Name date, --2016/7/4
  29. Year number, --
  30. Year_Half char(6), --2016H2
  31. Year_Month char(6), --
  32. Year_Quarter char(6),-- 2016Q3
  33. Half_Number number,--
  34. Half_Name char(2), --H2
  35. Quarter_Number number,--
  36. Quarter_Name char(2),--Q3
  37. Month_Number number,--
  38. Month_Name nvarchar2(20),--JUNL
  39. Week_Number number, --
  40. Week_Name nvarchar2(20),--Monday
  41. Creat_Date date, --创建时间
  42. Update_Date date) --更新时间
  43. ;
  44.  
  45. --测试选出一段时间
  46. select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
  47. connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'));
  48.  
  49. with
  50. temp_date as (
  51. select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual
  52. connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
  53. )
  54. select * from temp_date;
  55. --创建存储过程,导入时间
  56. CREATE OR REPLACE PROCEDURE SP_ADD_DATE
  57. AS
  58. v_Half number;
  59. v_Quarter number;
  60. v_Month DIM_Date.Month_Name%type;
  61. v_Month_Number number;
  62. CURSOR c_date IS
  63. SELECT Date_ID,DIM_Date.Date_Name FROM DIM_DATE;
  64. c_row c_date%rowtype;
  65. BEGIN
  66. MERGE INTO DIM_DATE T1
  67. USING(
  68. select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) date_name from dual
  69. connect by rownum<=(to_date('2018-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'))
  70. ) temp_Date
  71. on (t1.date_name=temp_Date.date_name)
  72. when matched then
  73. update set t1.date_id=to_char(temp_Date.date_name,'YYYYMMDD')
  74. when not matched then
  75. insert (Date_ID) values(to_char(temp_Date.date_name,'YYYYMMDD'));
  76. --循环游标
  77. FOR c_row in c_date loop
  78. v_Month_Number:=to_number(to_char(c_row.Date_Name,'MM'));
  79. if v_Month_Number>6 then
  80. v_Half:=2;
  81. else
  82. v_Half:=1;
  83. end if;
  84. update DIM_DATE set
  85. DIM_DATE.DATE_NAME=to_date(c_row.Date_ID,'YYYY-MM-DD'),
  86. DIM_DATE.HALF_NAME='H'||v_Half --后面在这里补充
  87. where DIM_DATE.DATE_ID=c_row.Date_ID;
  88. end loop;
  89. END;
  1. /*******************华丽的分割线********************/
  2. --创建地域维度表
  3. CREATE TABLE DIM_Geo(
  4. M_CNTY_ID number primary key,
  5. M_CNTY nvarchar2(20), --县
  6. M_CITY nvarchar2(20), --市
  7. M_PRVNC nvarchar2(20)--省
  8. );
  9.  
  10. --创建销售事实表
  11. CREATE TABLE SALES_FACT(
  12. EMPNO NUMBER(4),
  13. DATE_ID char(8),
  14. CITY_ID NUMBER,
  15. SALES NUMBER);
  16.  
  17. --基于多列的联合主键
  18. --此处为empnodate_ID, city_ID共同为一个主键
  19. alter table SALES_FACT add constraint PK_SALES_FACT
  20. PRIMARY KEY (EMPNO,DATE_ID,CITY_ID);
  21.  
  22. --查询出事实表
  23. WITH
  24. v1 as (select * from SALES_FACT),
  25. v2 as (select * from EMP),
  26. v3 as (select * from DIM_DATE),
  27. v9 as (select * from DIM_Geo),
  28. v6 as (select distinct sales_fact.city_id from sales_fact),
  29. v4 as(SELECT v2.ename,v1.date_id,v1.city_id,v1.sales FROM v1 right join v2
  30. on v2.empno=v1.empno),
  31. v5 as (select v4.ename,v3.date_id,v4.city_id,v4.sales from v4 partition by (v4.ename)
  32. right join v3 on v3.date_id=v4.date_id),
  33. v7 as (select v5.ename,v5.date_id,v6.city_id,v5.sales from v5 partition by (ename,date_id)
  34. right join v6 on v6.city_id=v5.city_id),
  35. 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
  36. 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
  37. order by v7.ename,v3.Quarter_Name,v3.Week_Name)
  38. select ename,month_name,v9.M_CNTY,v9.M_CITY,v9.M_PRVNC,sum(sales) from v8
  39. left join v9 on v8.city_id=v9.M_CNTY_ID WHERE ENAME='ADAMS' GROUP BY ename,month_name,v9.M_CNTY,
  40. 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 函数
 
 
  1. select regexp_substr('ABCD EF G','[^ ]+',1,level,'c') from dual
  2. connect by regexp_substr('ABCD EF G','[^ ]+',1,level,'c') is not null ;

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

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

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

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

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

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

最终结果:

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

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

  1. select
  2. t.student
  3. ,t.subject
  4. ,teacherRecord.teacher
  5. from t left outer join teacherRecord
  6. on t.teacher like '%' || teacherRecord.teacher || '%'

最终结果:

orcle数据库表导出csv文件

废话少说,直接来代码:

  1. set colsep ,
  2. set feedback off
  3. set heading off
  4. set trimout on
  5. spool D:\DBoracle\lfc.csv
  6. select '"' || yyyymm || '","' || yyyymmdd || '","' || bu_cd || '"from jim_CALL;
  7. spool off
  8. 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++模板的一些巧妙功能

    判断类中是否有指定名称的函数: #include<utility> #define HAS_MEMBER(member)\ template<typename T,typename. ...

  2. python with open as f 写韩文中文乱码

    python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...

  3. 【转】linux平台Redis安装部署

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...

  4. java ----获取路径的各种方法(总结)

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http: ...

  5. 线性表的链式存储——C语言实现

    SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...

  6. C语言学习笔记--指针阅读技巧

    1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...

  7. DAY17-Django之logging

    LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': ...

  8. 【WebRTC】术语

    WebRTC,名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  9. redis的特性

  10. Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)

    题意:过年了,Bob要抢红包.抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收 ...