积跬步,至千里!!!

120140708 

1.1Oracle用户下数据移植到另外一个库的方法: 

1.第一步,tool下的compare user object 同步用户对象 

第二步,tool下的compare table data 同步表数据 

2.在终端cmd里,直接用exp指令(不必登陆oracle)用‘用户导出’法导出相应用户下的.dmp文件 

Exp userid = zhangwensi/zhangwensi@orcl owner =zhangwensi file = D:/zhangwensi_back , 

再在plsql里面,tool下的 import table 直接导入或者就是还在终端里面用imp指令 

Imp Userid = laozhang/laozhang@orcl fromuser = zhangwensi touser = laozhang file = D:/zhangwensi_back 。 

3.单张表的导出和导入 

Exp userid = zhangwensi/zhangwensi@orcl tables=books file = D:/xxx_back 

Imp userid =laozhang/laozhang@orcl tables=books file=D:/xxx_back 

1.2Linux exp/imp的操作 

1.2.1全库导出: 

exp userid=cams/cams@cams full=y file=(/tmp/1.dmp, /tmp/2.dmp, /tmp/3.dmp) filesize=2GB log=/tmp/cat_log.log 

1.2.2用户导出: 

exp userid=cams/cams@cams owner=cams file=(/tmp/1.dmp, /tmp/2.dmp, /tmp/3.dmp) filesize=2GB log=/tmp/cat_log.log 

1.2.3表导出 

exp userid=cams/cams@cams tables=(tbl, tb2) file=(/tmp/1.dmp, /tmp/2.dmp) filesize=2GB log=/tmp/cat_log.log 

 

dmp导法超快。 

 

1.3db2中的数据导出 xx.ixf 类型

1.通过SSH连接到db2相应的库和用户,然后在linux窗口输入以下指令

Step1: db2 connect to iacm user iacm_w1 using iacm_w1 

Step2: db2 set current schema iacm_w1 

Step3: db2 "export to /home/db2inst1/zws/TD_SEARCH_ENGINE.ixf of ixf select * from TD_SEARCH_ENGINE"; 

最后的数据文件 xx .ixf 就会在130服务器上的相应文件夹里生成。 

1.4将数据文件XX.ixf文件的数据写入表里 

Step1.打开db2命令窗口输入Db2 connect to iacm user iacm_w1 using iacm_w1 

Step2. db2 set current schema iacm_w1 

Step3. db2 tf 文件路径D:/工作/数据/db2初始化数据/Td_search_engine.ixf 

 

 

 

 

 

220140709 

2.1Plsql的数据和表的导出 

1.Tool 下选择export tables 

导出的是你选择的项的表的数据

2.tool下选择export user objects 

导出的东西是表的建表语句 

3oracle 表空间创建

create temporary tablespace user_temp

tempfile 'D:appShinelonoradatauser_temp.dbf'

size 1024m

autoextend on

next 50m maxsize 20480m

extent management local;

/*第2步:创建数据表空间 */

create tablespace user_data

logging

datafile 'D:appShinelonoradatauser_data.dbf'

size 2040m

autoextend on

next 50m maxsize 20480m

extent management local;

/*第3步:创建用户并指定表空间 */

create user zhangwensi identified by zhangwensi

default tablespace user_data

temporary tablespace user_temp;


drop user zhangwensi cascade;

2.2Db2表空间的创建 

-- 创建32K缓存池 

CREATE BUFFERPOOL BUF_POOL_32K 

IMMEDIATE 

SIZE 5000 

NUMBLOCKPAGES 0 

PAGESIZE 32 K; 

 

-- 创建SCHEMA 

CREATE SCHEMA isop_dim 

AUTHORIZATION DB2INST1; 

COMMIT; 

 

-- 创建表空间 

CREATE LARGE TABLESPACE TBS_ISOP_DIM 

PAGESIZE 32K 

MANAGED BY DATABASE 

USING 

(File '/home/ngbass/db2/db2_hwia/ISOP_DIM.dbf' 256000 

EXTENTSIZE 32 

PREFETCHSIZE AUTOMATIC 

BUFFERPOOL BUF_POOL_32K 

DROPPED TABLE RECOVERY ON; 

 

-- 创建临时表空间 

CREATE USER TEMPORARY TABLESPACE TBS_ISOP_DIM_TMP 

PAGESIZE 32K 

MANAGED BY DATABASE 

USING(FILE '/home/ngbass/db2/db2_hwia/ISOP_DIM_TMP.dbf' 128000) 

EXTENTSIZE 80 bufferpool BUF_POOL_32K 

DROPPED TABLE RECOVERY OFF; 

 

 

2.3plsql导出的数据,要经过转为unixISCII码,才能进行导入。否则会出现乱码

 

 

 

 

 

320140710 
3.1实例的切换 

3.2oracle增加表空间 ,添加数据文件 。 
alter tablespace user_data add datafile 'D:appzWX214991oradataorcluser_data_add1.dbf' size 2G; 
3.3查看当前用户使用的表空间 
select t.tablespace_name from user_tablespaces t ; 
3.4ORA-01536: 超出表空间 'USER_DATA' 的空间限额 
当你在建表的时候,oracle报这样的错的时候,解决! 
1.在当前用户下窗口查看空间限额的字段:max_bytes 
select * from user_ts_quotas; 
2.sys/sys dba权限下,给用户增加空间限额 
alter user zhangwensi quota unlimited on user_data; 不限制 
alter user zhangwensi quota 50 on user_data; 50 
3.收回空间限额的空间 
revoke unlimited tablespace from user; 
alter user zhangwensi quota 0 on user_data; 
3.5Oracle数据库的存储结构 
3.5.1物理结构 

物理结构分为:Datafiles 数据文件,control Files 控制文件 和 online redo Logs 联机日志文件。 
3.5.2逻辑结构 
Oracle 存储结构有数据块(Data Block)》区(Extent)》段(segment)》表空间(tablespace4部分组成。 

420140723 


4.1约束类型和写法 
book表为例: 
写法一: 
create table books( 
bookno number(10) not null, 
category varchar2(20), 
bookname varchar2(20), 
author varchar2(20), 
saleplace varchar2(100), 
price number(15,3) 
/* constraint books_1 primary key(bookno) */ 

约束条件constraint ,可以直接写在字段后面,语法为 constraint + 约束名(自己取) 
+primary, uniquecheck and foreign key + (要约束的字段);(见上) 
除此之外还有 非空约束 not null 。 

1.constraint books_1 check(bookno in ('female','male')) 
2.constraint books_2 primary key(bookno) 
3.constraint books_3 foreign key(bookno) references READER (BORROWNO) 
4.not null 不能用这种写法,直接写在 字段后。 

写法二: 
create table books( 
bookno number(10) not null, 
category varchar2(20), 
bookname varchar2(20), 
author varchar2(20), 
saleplace varchar2(100), 
price number(15,3) 


alter table books 
add constraint haha primary key (bookno);--constraint +约束名)可加可不加 

alter table books 
add constraint sb foreign key (bookno) --constraint +约束名)可加可不加 
references READER (BORROWNO);

4.2关联子查询(exists) 
emp表的: JAMES 的领导是谁? 
(关联子查询) 通过exists来实现 

select ename 
from emp E1 
where exists ( select 1 
from emp E2 
where E2.MGR = E1.empno 
and E2.ename = 'JAMES') - - 优先查询外层表 

注意: select 1 
from emp E2 
where E2.MGR = E1.empno 
and E2.ename = 'JAMES' 这个查询语句中的 ,代表查询结果中出现一个’1‘ 就是一条数据,如下,下面就是查询出10条数据。 
11 
21 
31 
41 
51 
61 
71 
81 
91 
101 

总结: 
1.若用in,则oracle 会优先查询子查询,然后匹配外层查询, 
2.若使用exists,则oracle 会优先查询外层表,然后再与内层表匹配。

4.3With t1 as 用法 
with t1 as (select * from a), 
t2 as ( select * from b) 
select * 
from t1, t2 
where t1.no = t2.no; 
查询出来的东西放在临时表t1t2 中 
4.4Update批量更新 
td_cont_app_mng_temp中的中文注释和英文注释添加到td_cont_app_mng表中的 
相同id的列 
update td_cont_app_mng t 
set t.app_desc_cn = (select m.app_desc_cn 
from td_cont_app_mng_temp m 
where m.app_id = t.app_id), 
t.app_desc_en =(select m.app_desc_en 
from td_cont_app_mng_temp m 
where m.app_id = t.app_id) 
where t.app_id in (select x.app_id 
from td_cont_app_mng_temp x )

4.5游标的使用 
-- 声明游标;CURSOR cursor_name IS select_statement 

--For 循环游标 
--1)定义游标 
--2)定义游标变量 
--3)使用for循环来使用这个游标 
declare 
--类型定义 
cursor c_job 
is 
select empno,ename,job,sal 
from emp 
where job='MANAGER'; 
--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型 
c_row c_job%rowtype; 
begin 
for c_row in c_job loop 
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); 
end loop; 
end; 



--Fetch游标 
--使用的时候必须要明确的打开和关闭 

declare 
--类型定义 
cursor c_job 
is 
select empno,ename,job,sal 
from emp 
where job='MANAGER'; 
--定义一个游标变量 
c_row c_job%rowtype; 
begin 
open c_job; 
loop 
--提取一行数据到c_row 
fetch c_job into c_row; 
--判读是否提取到值,没取到值就退出 
--取到值c_job%notfound false 
--取不到值c_job%notfound true 
exit when c_job%notfound; 
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); 
end loop; 
--关闭游标 
close c_job; 
end;

4.6Delete from table_name 和 truncate table table_name 的区别 
1.Delete 可以产生回滚段,而truncateDDL语言,删掉就没了,不能回滚 
2.truncate会进行空间回收,而且删除数据速度比较快哦 
520140725shell) 
5.1linux下安装oracle为什么要创建oracle用户
要有专门属于oracle的环境变量等,oracle的环境变量都是配置在oracle用户下的
安全。权限 

5.2查看当前登陆到系统的的用户 
who -m 
5.3Shell中常用的通配符 

5.4Shell的元字符 
+’ +前面的字符出现一次或者多次(至少一次), 
*’ *前面的字符出现零次或者多次(任意次), 
‘?’?前面的字符出现零次或者一次 
‘ ’ 点号 匹配单个任意字符 
‘ ^’以..开头和以…结尾 
[ ]’ 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grepgrep。 
[^]’ 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-RT-Z的一个字母开头,紧跟rep的行。

 


620140728 
6.1正则截取函数regexp_substr 
REEXP_SUBSTR(string ,pattern,position,occurrence,modifier); 
? -- Pattern : 进行匹配的正则表达式 
? -- Position :起始位置,从第几个字符开始正则表达式匹配(默认为1) 
? -- Occurrence :标识第几个匹配组,默认为
? -- Modifier :模式(’i’ 不区分大小写进行检索,’区分大小写进行检索,默认为’c’) 
?Select regexp_substr (17,22,33,44,55,[^,]+,1,3,i) as str from dual; 
6.2Regexp_like()Regexp_replace() 用户条件语句中 
Regexp_replace(string,[a-zA-Z]
Regexp_like(string,‘^[0-9]*
匹配字母或数字或下划线或汉字 
匹配任意的空白符 
匹配数字 
匹配单词的开始或结束

regexp_replace

以(.*)来匹配规律或者分割的字符,第三个参数的‘1’表示第一个位置。。。类推

--截取类似于字符串123_1563中的123
SELECT regexp_replace('123_1563','(.*)_(.*)','2') FROM dual;
SELECT regexp_replace('123_1563','_[[:digit:]]+','') FROM dual;
--把字符串'123456fewfwefe34165'替换为0的字符串
SELECT regexp_replace('123456fewfwefe34165','[^[:digit:]]','0') FROM dual;
--把姓与名互相替换位置(因为英语名跟中文名是不一样的。)
SELECT regexp_replace('mei han','(.*) (.*)','2 1' ) FROM dual;
select  regexp_replace('ddddddddgeeeeeeeee','(.*)g(.*)','2g1') from dual;

 以逗号分割字符串

 SELECT 【distinct】REGEXP_SUBSTR ('c1','[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('c1','[^,]+',1,LEVEL) IS NOT NULL
order by 1

 新建索引

-- Create/Recreate indexes
create index POLAPDATA.IDX_AIS_OFFER_POLICY_DETAIL on POLAPDATA.AIS_OFFER_POLICY_COST_DETAIL (POLICY_NO) initrans 16;

 

字符串以逗号分隔,转成多条记录:

 SELECT 【distinct】REGEXP_SUBSTR ('12,12,23,3434,545,656','[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('12,12,23,3434,545,656','[^,]+',1,LEVEL) IS NOT NULL
order by 1

oracle 给参数赋值的两个方法:

  1. CREATE OR REPLACE Procedure grantValue Is  
  2.    v_tabName     Varchar2(50);  
  3.    v_recordNum   Number;  
  4.    v_var         Varchar2(50) := '直接赋值法'-- 方法1 直接赋值  
  5.    v_minvar      Varchar2(50);  
  6.    v_sql         Varchar2(200);  
  7.    v_tab         Varchar2(50);  
  8.  Begin  
  9.      
  10.     -- 方法二, select into 方法  
  11.     Select Min(t.sal) Into v_minvar From emp t;  
  12.     dbms_output.put_line('最少工资为'||v_minvar);  
  13.   
  14.     -- 方法三, 动态sql 发  
  15.     v_tab := 'emp';  
  16.     v_sql := 'select count(*) from '|| v_tab;  
  17.     Execute Immediate v_sql Into v_minvar;  
  18.     dbms_output.put_line('公司总人数为'||v_minvar);  
  19.       
  20.  End grantValue;  
  21. /  

行转列的方法:

数据如下,要将其改为行,使用wm_concat()函数可将其用逗号隔开

       

lag函数的用法和lead函数的用法:(lead方法略)

--1、不使用分组partition by ,直接order by ,表示向下移动一行,第一行没有的值用null代替,默认就是null
select
deptno, sal a, lag(sal,1, null) over( order by deptno) from emp;


--1、使用分组partition by ,从下面可以看见分为3组,每组不干扰,每一行想下移
select deptno, sal a, lag(sal,1, null) over(partition by deptno order by deptno) from emp;

随机数的取法:

 第一步:

      select dbms_random.value  from dual;--随机生成小数

第二步:转换成varchar2类型

 select cast(dbms_random.value as varchar2(10)) from dual;--cast 转换成varchar2类型 

第三步:截取小数点之后的数,四位随机数

select substr(cast(dbms_random.value as number),3,4) from dual;

 

2)使用trunc处理数字

取0-100的整数怎么取呢

select trunc(dbms_random.value(0,100)) from dual;

取0-100的数字保留一位小数

select trunc(dbms_random.value(0,100),1) from dual;

系统随机在10个数字键中给用户指定3个按键

 select lpad(trunc(dbms_random.value(0,999)),3,'0') from dual;

oracle精确到毫秒的时间设置:

select to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss.ff6') from dual;
select to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss.ff6') from dual;

select  substr('2017-02-28 17:10:03.057818',18,2) + substr('2017-02-28 17:10:03.057818',21,6)/1000000 from dual ;

oracle 的merge into 语法:

/*Merge into 详细介绍
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
*/
/*语法:
MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;
*/

 例子:

merge into users
using doctor
on (users.user_id = doctor.doctorid)
when matched then
  update set users.user_name = doctor.doctorname
when not matched then
  insert
  values
    (doctor.doctorid,
     doctor.doctorid,
     '8736F1C243E3B14941A59FF736E1B5A8',
     doctor.doctorname,
     sysdate,
     'T',
     ' ',
     doctor.deptid,
     'b319dac7-2c5c-496a-bc36-7f3e1cc066b8');

调用含有返回值的存储过程:

        BEGIN
            v_rule_id := 'C09';

            --查找规则ID
            PKG_LOOK_UP_RULE_TABLE.p_find_item_id_status (
                              i_userid                => i_userid                    ,    --操作者
                              i_item_id                => TO_NUMBER(i_item_id)        ,    --档期ID
                              i_item_oper_desc        => v_rule_id                ,    --当前档期操作状态规则码
                              i_oper_status            => ''                        ,   --规则步骤(状态值)
                              o_result                => o_result                    ,    --执行结果 0:成功 其它:失败
                              o_errmsg                => o_errmsg                    ,    --异常信息
                              o_item_flag            => v_item_status                --档期状态
                             );

            IF o_result <> 0 THEN
                ROLLBACK;
                RETURN;
            END IF;

        END;

关于SQL窗口函数中sum 累计求和

关键字:

rows BETWEEN unbounded preceding and current row
SELECT
	t1.cal_date AS "日期",
	t1.fg_code AS "机种",
	t1.outbound_num AS "出库数", 
	sum(t1.outbound_num)over(partition by t1.cal_date order by 1 rows BETWEEN unbounded preceding and current row ) as "累计出库数"
FROM pmrz_ods_sap_in_out_bound t1  

欢迎对it热情的同学,加qq进行技术讨论; QQ:850922253
原文地址:https://www.cnblogs.com/zhangwensi/p/3981777.html