oracle数据库

上一篇 / 下一篇  2015-03-12 22:56:42 / 个人分类:原创

查看数据库状态
select status from v$instance;

一、数据类型:
number:number(9,2)共9位,小数点后2位
char/varchar2:char最大2000位,varchar2最大4000
date:不带毫秒
timestamp:带毫秒,时区信息
clob/blob:大的二进制类型的字符,最大2G

***UTF-8字符集:一个中文占三个字符
***当前时间:select sysdate(systimestamp) from dual

二、数据库定义语言(DDL)
create table [table_name](column1 char(10) not null, column2 varchar2(60), column3 number(5,3));
alter table [table_name] add [column] [type]
drop 
rename
truncate
***drop/truncate/delete的区别:
1、drop、truncate都是DDL语句,执行后会自动提交。
2、truncate和delete只删除数据,不删除表的结构;drop语句将删除表的结构,被依赖的约束、触发器、索引,依赖于该表的存储过程、函数将保留,状态变为invalid状态。delete语句会触发时间,如trigger。truncate与事务无关。
3、执行速度:drop>truncate>delete

***desc [table_name]:查看表结构
***注释:单行--多行/*   */

三、数据操纵语言(DML)
insert/select/delete/update
insert into [table_name](column1,column2,column3) values(val1,val2,val3);
insert into [table_name](column1,column2,column3) select c1,c2,c3 from table2;
update [table_name] set old_column=new_column where ...

四、控制命令
commit提交,rollback回滚

五、条件表达式
1、case when
case sex
when '1' then '男'
when '2' then '女'
else '其他'
end
case 
when sex='1' then '男'
when sex='2' then '女'
else '其他'
end
----------------------------
case when 在select中的用法
select grade, COUNT(case when sex = 1 then 1
    else 0
    end) 男生数,
      COUNT(case when sex = 2 then 1
    else 0
    end) 女生数
from students 
group by grade;
------------------------------
case when 在where中的用法
select t1.*,t2.*
from t1,t2
where (case when t2.compare_type = 'A' and t1.some_type like 'nothing %' then 1
    when t2.compare_type !='A' and t1.some_type not like 'nothing%' then 1
    else 0
    end) = 1;
-------------------------------
case when 在group by 中的用法
SELECT 
CASE WHEN salary <= 500 THEN '1'
     WHEN salary >500 AND salary <= 600 THEN '2'
     WHEN salary >600 AND salary <= 800 THEN '3'
     WHEN salary >800 AND salary <= 1000 THEN '4'
ELSE NULL END  salary_class, 
COUNT(*)
FROM Table_a
GROUP BY 
CASE WHEN salary <= 500 THEN '1'
     WHEN salary >500 AND salary <= 600 THEN '2'
     WHEN salary >600 AND salary <= 800 THEN '3'
     WHEN salary >800 AND salary <= 1000 THEN '4'
ELSE NULL END ;

2、decode()函数
decode(value,if1,then1,if2,then2...ifn,thenn,else) :Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。  
例子;
CREATE OR REPLACE VIEW bank_date_lst AS
Select to_char(tran_date,’yyyy .mm’),
SUM( DECODE ( bank_code,’001’, tran_val,0 )) 城西区,
SUM( DECODE ( bank_code,’002’, tran_val,0 )) 城南区,
SUM( DECODE ( bank_code,’003’, tran_val,0 )) 城东区
FROM pay_lst
GROUP BY to_char(tran_date,’yyyy .mm’);

六、序列
select [table_name].nextval from dual;全局的
select [table_name].currval from dual;局部的

七、存储过程
声明——执行体开始——异常处理——执行体结束
create or replace proccedure [name]
is
begin
end;


例子:

CREATE OR REPLACE PROCEDURE存储过程名

(

--定义参数

 is_ym  IN CHAR(6) ,

the_count OUT NUMBER,

)

AS

--定义变量

vs_msg   VARCHAR2(4000);   --错误信息变量

vs_ym_beg  CHAR(6);      --起始月份

vs_ym_end  CHAR(6);      --终止月份

vs_ym_sn_beg CHAR(6);     --同期起始月份

vs_ym_sn_end CHAR(6);     --同期终止月份

--定义游标(简单的说就是一个可以遍历的结果集)

CURSOR cur_1 IS

  SELECT。。。

  FROM。。。

    WHERE。。。

   GROUP BY。。。;

BEGIN

--用输入参数给变量赋初值,用到了OralceSUBSTR TO_CHAR ADD_MONTHS

TO_DATE等很常用的函数。

vs_ym_beg := SUBSTR(is_ym,1,6);

vs_ym_end := SUBSTR(is_ym,7,6);

vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm');

vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm');

--先删除表中特定条件的数据。

DELETE FROM表名WHERE ym = is_ym;

  --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount

DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'');

INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt)

SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000

FROM BGD_AREA_CM_M_BASE_T

  WHERE ym >= vs_ym_beg

  AND ym <= vs_ym_end

GROUP BY area_code,CMCODE;

DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'');

--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。

FOR rec IN cur_1 LOOP

  UPDATE表名

  SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn

   WHERE area_code = rec.area_code

   AND CMCODE = rec.CMCODE

   AND ym = is_ym;

END LOOP;

COMMIT;

--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。

EXCEPTION

   WHEN OTHERS THEN

      vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);

   ROLLBACK;

   --把当前错误记录进日志表。

   INSERT INTO LOG_INFO(proc_name,error_info,op_date)

   VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);

   COMMIT;

   RETURN;

END;

****************补充:游标、循环(简单循环、while循环、for循环、游标for循环)、异常处理;动态SQL


常用-查询相关:

1、 连接(left join/right join/inner join/outer join/union/union allor子查询(=/in/exists)

2、 Group by:通常和聚合函数配合使用,select后面的所有列中,没有使用聚合函数的列,必须出现在group by后面。

-----where自居的作用实在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数。

-----hacing子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数。Having子句被限制在已经在select语句中定义的列和聚合表达式上。

SELECT A,COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

3grouping



TAG: 数据库 Oracle

 

评分:0

我来说两句

日历

« 2024-05-11  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18439
  • 日志数: 25
  • 建立时间: 2014-11-10
  • 更新时间: 2015-03-12

RSS订阅

Open Toolbar