oracle学习笔记

一、group by 和having 的使用

group by 通常用于查询语句的分组显示。

例如select home_city,t.user_id , count(1) from users t group by t.home_city,user_id;将users表中按home_city , user_id来分组,既一个表中有多个地市和用户ID组合的数据,只显示一个,和dinstinct功能类似,起到过滤相同数据的作用。

having和group by一起使用,作用类似where,为对group by 分组后的数据,进行条件过滤。having过滤条件字段必须存在select 之后的字段中,或select之后的聚合函数。例如:

select home_city,t.user_id , count(1) from users t group by t.home_city,user_id having home_city>590; 
select home_city,t.user_id , count(1) from users t group by t.home_city,user_id having count(1) > 10;

二、存储过程

1.打印hellow world ! --打印结果在DBMS Output窗口中打印出来。后续只粘贴关键语法

declare 
  str varchar(100); 
begin
  -- Test statements here
  select 'hello world' into str from dual;
  dbms_output.put_line(str);
end;

如果是cmd窗口,或sql windows窗口执行,要先set serveroutput on;

 2.变量(普通变量、特殊变量)

普通变量

直接赋值: v_name := 'zhangsan';

语句赋值:  select 'zhagnsan' into v_address from dual;

引用型变量

v_age users.age%type;//表名.字段名%type;--不直接定义某种类型而是连接表字段的类型

记录型变量(效率不如引用型变量,因为只能select * into ...)

v_user_row  users%rowtype;//直接定义成某表的所有字段类型

select *  into v_user_row from users where user_id = 1003;

条件分支

if condition then 

    do

elsif condition then    //elsif  这个和java的语句有点不同

    do

else

    do

end if;

while 循环

  i := 10;
  loop
  dbms_output.put_line('i=' || i);  
  i := i -1;
  exit when i < 1;
  end loop;

游标

显示游标

执行顺序:声明游标 -> 打开游标 -> 循环输出游标  -> 关闭游标

declare

cursor user_cursor is( select *  from users where rownum < 3);//声明并赋值

  cursor user_cursor(v_home_city users.home_city%type) is( select *  from users where home_city = v_home_city and rownum <= 3);//带参数的声明并赋值

begin 

  open user_cursor;//打开游标

 open user_cursor(591);//有传参给游标的打开游标
  loop
    fetch user_cursor into v_user;  //每次取一条数据
    exit when user_cursor%notfound; //如果最近一次没取到数据,返回true
    dbms_output.put_line('username:' || v_user.user_name || ', msisdn=' || v_user.msisdn);
   end loop;  
   close user_cursor;

end;

游标注意事项:先取数据,然后在判断是否有取到一条数据;

隐示游标,既游标由oracle内部控制

for循环时,oracle内部控制游标进行打开并遍历、关闭游标

带参游标

create or replace procedure p_hello(v_id in users.user_id%type , v_name out users.user_name%type) is
begin
  dbms_output.put_line('hello world' || v_name);
end p_hello;

创建时,输入参数,输出参数都有游标后面的括号里面体现,用in、out区别

调用存储过程

p_hello(1001,v_name);//传入1001,返回的user_name用v_name接受

truncate 删除表记录

和delete一样,是做表数据删除的操作,但是有所区别

1.不带where语句,只能做全表数据清空

   //如果表有做分区,删除的刚好是某个分区的数据,可以使用alter table truncate partition '分区名' 来删除该分区的数据,不影响其       他分区

2.为DDL操作,无回滚操作

3.速度相对快很多

4.无对应的回滚备用日志等产生

5.重新设置高水平线和所有的索引,释放空数据块//delete删除数据,数据块的残留,会使得即使表数据被删除,下次查询还是会扫描到原来存数据的数据块,使得虽然表数据少了,查询速度并没有加快。

数据库锁表解决

1.查询对应锁表信息

select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号                            
from v$locked_object l , dba_objects o , v$session s , v$process p                             
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;    

2.手动结束锁表食物

alter system kill session 'sid,serial#';--sid及serial#为第一步查出来的数据。
--------------------- 
作者:榕先生 
来源:CSDN 
原文:https://blog.csdn.net/qq_41889752/article/details/86219498 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值