Oracle常用语句&函数

DENSE_RANK () OVER (ORDER BY 字段 )
RANK () OVER (ORDER BY 字段 )


1、用户解锁
alter user 用户名 account unlock;


2、用户修改密码
alter user 用户名 identified by 密码;


3、网页登陆
http://IP:1158/em


4、cmd登陆
sqlplus 用户名/密码;
show user;


5、查看一个表的结构
desc 表名;


6、查询每个人的年薪
select ename,sal*12 salofyear from emp;


注意:null参与数学运算的时候结果还是null


7、通过dual表进行查询
--查询系统时间
select sysdate  from dual;
显示'的时候需要''表示一个'


8、-- 内连接
select emp2.ename as 员工名字 ,dept2.dname as 所在部门 from emp2 ,dept2 where emp2.deptno=dept2.deptno;
-- 外左连接
select emp2.ename as 员工名字 ,dept2.dname as 所在部门 from emp2 left join dept2 on emp2.deptno=dept2.deptno;
-- 外右连接
select emp2.ename as 员工名字 ,dept2.dname as 所在部门 from emp2 right join dept2 on emp2.deptno=dept2.deptno;


9、--分页查询(4,6) rownum
select * from (select e.*,rownum rn  from


    (select * from emp2 order by sal desc ) e
     where rownum <=6
) where rn>=4;


10、--外键
alter table 表名 add constraint 外键名 foreign key(字段) references 表名(字段)
(可加 on delete cascade或 on update cascade 表示 主键表中的外键值删除或更新,子健表中的值也会删除或更新)


11 --建表
create table account(


id number primary key,--主键
name varchar2(20) default '默认值' NOT NULL(非空),


money number(20,2)check (money in(100,1000)) --只能写入100或1000
);




12-- 随机查询一条数据
select *from ( select *  from emp order by dbms_random.value)where rownum=1;


13
select*from emp2 where sal>2000 intersect select * from emp2 where job='MANAGER'--交集查询
select*from emp2 where sal>2000 union select * from emp2 where job='MANAGER'--并集不重复查询
select*from emp2 where sal>2000 minus select * from emp2 where job='MANAGER'--差集集查询


14、保存点
select * from emp;
savepoint a;
delete from emp where empno=7369;
savepoint b;
delete from emp where empno=7499;
savepoint c;
delete from emp where empno=7521;
--commit;
rollback to a;




15-创建用户
connect system/bchy;
--创建表空间
create tablespace bchy datafile 'd:\bchy.dbf' size 5m autoextend on next 10m maxsize 500m;
--创建用户,赋予角色
drop user wangcai cascade;
create user wangcai identified by wangcai default tablespace bchy;
grant connect,resource to wangcai;
connect wangcai/wangcai;
--创建表,默认在bchy这个命名空间
create table test(
       id number,
       name char(1000)
) /*tablespace bchy*/;
--快速插入语句测试
insert into test values(1,'呵呵');
insert into test(id,name)
select * from test;
--扩展表空间
alter tablespace bchy add datafile 'd:\bchy.dbf' size 20m;
alter tablespace bchy 'd:\bchy.dbf' resize 20m;
alter tablespace bchy 'd:\bchy.dbf' autoextend on next 10m maxsize 500m;


38、导入导出
--导出
 exp
--创建用户
 create user wangcai identified by wangcai
 default tablespace users
 quota 10m on users;
--分配权限
 grant create session ,create table,create view to wangcai;
--导入
 imp


39、备份表
 create table emp2 
 as
 select * from emp;




43、修改表
 a、添加列
alter table student add(addr nvarchar2(50));
 b、删除列
alter table student drop(addr);
 c、修改列
alter table student modify(addr nvarchar2(100));
44、回滚
rollback;


45、查询某个表的约束
select constraint_name from all_constraints
where table_name='STUDENT' and owner='WANGCAI';


select constraint_name from user_constraints;


46、创建索引
create index index_student_email on student(email);
select index_name from user_indexes;


47、PL_SQL
a、输出
begin
dbms_output.put_line('''HelloWorld''');
end;
/

b、定义变量


变量声明的规则:
1、变量名不能使用保留字、关键字,如from,select等
2、第一个字符必须是字母
3、变量名最多包含30个字符
4、不要与数据库的表或者列同名
5、每一行只能声明一个变量
常用变量类型:
1、binary_integer:整数,主要用来计数而不是用来表示字段类型
2、number:数字类型
3、char:定长字符串
4、varchar2:变长字符串
5、date:日期
6、long:长字符串,最长2GB
7、boolean:布尔类型,可以取值为true,false和null值


注意:bollean类型不能直接打印输出



declare
v_name varchar2(20);
v_age number(2);
v_sex varchar2(2):='男';
begin
v_name:='d';
v_age:=12;
dbms_output.put_line(v_name);
dbms_output.put_line(v_age);
dbms_output.put_line(v_sex);
end;




declare
    v_temp number(1);
    v_count binary_integer :=0;
    v_sal number(7,2) := 4000.00;
    v_date date := sysdate;
    v_pi constant number(3,2) := 3.14;
    v_valid boolean := false;
    v_name varchar2(20) not null := 'zhangsan';
begin
  dbms_output.put_line('v_temp value:'|| v_temp);
    dbms_output.put_line('v_count value:'|| v_count);
end;


c、捕捉异常
declare
v_num number :=0;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when no_data_found then
dbms_output.put_line('no_data_found ');
when others then
dbms_output.put_line('error');
end;


d、table,相当于数组(了解)


declare
    type type_table_emp_empno is table of emp.empno%type index by binary_integer


    v_empnos type_table_emp_empno;
begin
  v_empnos(0):=1234;
    v_empnos(-1):=45;
    v_empnos(-2):=1212;
    v_empnos(2):=34;
    dbms_output.put_line( v_empnos(0));
    dbms_output.put_line( v_empnos(-1));
    dbms_output.put_line( v_empnos(-2));
    dbms_output.put_line( v_empnos(2));
end;


e、record,相当于类


declare
    type type_record_dept is record
    (
            deptno dept.deptno%type,
            dname dept.dname%type,
            loc dept.loc%type
            );
    v_temp type_record_dept;
begin
    v_temp.deptno:=50;
    v_temp.dname:='abc';
    v_temp.loc :='china';
    dbms_output.put_line(v_temp.deptno||' '||v_temp.dname||' '||v_temp.loc);


         end;


f、使用rowtype声明record变量
declare
    v_temp dept%rowtype;
begin
    v_temp.deptno:=50;
    v_temp.dname:='abc';
    v_temp.loc :='china';
    dbms_output.put_line(v_temp.deptno||' '||v_temp.dname||' '||v_temp.loc);


end;


g、变量的定义及通过查询赋值
必须唯一赋值,查询结果不能为null
declare
    v_ename emp.ename%type;
    v_sal emp.sal%type;
  begin
    select ename,sal into v_ename,v_sal from emp
    where empno = 7369;
    dbms_output.put_line(v_ename||' '||v_sal);
  end;



h、使用rowtype声明record变量及通过查询赋值


declare
    v_emp emp%rowtype;
begin
    select * into v_emp from emp where empno=7369;
    dbms_output.put_line(v_emp.ename||' '||v_emp.empno);
end;
 
i、查询受影响的行数
只有修改数据的时候才有意义


begin
    delete from emp2;
    dbms_output.put_line(sql%rowcount||'受影响');
end;

j、在pl_sql里使用create时使用execute immediate
 
         begin
    execute immediate 'create table b(name nvarchar2(10) default ''abc'')';
end;
 
k、选择结构
 
declare
    v_sal emp.sal%type;
begin
    select sal into v_sal from emp where empno = 7369;
    if(v_sal<1000) then
    dbms_output.put_line('苦逼');
    elsif(v_sal<8000) then
    dbms_output.put_line('屌丝');
    else
    dbms_output.put_line('高大上');
    end if;
end;


L、循环结构
1、类似java中的do while
declare
    i binary_integer:=1;
begin
    loop
            dbms_output.put_line(i);
            i:=i+1;
            exit when(i>=10);
    end loop;
end;
2、类似java中的while
declare
    i binary_integer:=1;
begin
    while(i<11) loop
            dbms_output.put_line(i);
            i:=i+1;
    end loop;
end;


3、类似java中的for
begin
    for i in 100..10 loop
            dbms_output.put_line(i);
    end loop;
end;


begin
    for i in reverse 100..10 loop
            dbms_output.put_line(i);
    end loop;
end;

m、错误处理


declare
    v_temp number(4);
  begin
    select empno into v_temp from emp where deptno=10;
  exception
    when too_many_rows then
            dbms_output.put_line('太多记录了');
    when others then
            dbms_output.put_line('error');
  end;





declare
    v_temp number(4);
begin
    select empno into v_temp from emp where empno=1111;
exception
    when no_data_found then
            dbms_output.put_line('没数据');
    when others then
            dbms_output.put_line('error');
end;



--创建记录错误的表
create table errorlog
(
    id number primary key,
  errcode number,
    errmsg varchar2(1024),
    errdate date
);
--创建序列
create sequence seq_errorlog_id start with 1 increment by 1;
--使用
declare
    v_deptno dept.deptno%type := 10;
    v_errcode errorlog.errcode%type;
    v_errmsg errorlog.errmsg%type;
    v_errdate errorlog.errdate%type;
  begin
    delete from dept where deptno = v_deptno;
    commit;
  exception
    when others then
            rollback;
            v_errcode := sqlcode;
            v_errmsg := sqlerrm;
            v_errdate := sysdate;
            insert into errorlog values(seq_errorlog_id.nextval,v_errcode,v_errmsg,v_errdate);
            commit;
  end;


n、游标


游标的属性:


set serveroutput on;
declare
    cursor c is select * from emp;
    v_emp c%rowtype;
begin
    open c;
            fetch c into v_emp;
            dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
    close c;
end;







declare
    cursor  c is select * from  emp;
    v_emp c%rowtype;
begin
    open c;
            loop
                    fetch c into v_emp;
                    exit when(c%notfound);
                    dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
            end loop;
    close c;
end;








declare
    cursor c is select * from emp;
    v_emp c%rowtype;
begin
    open c;
            fetch c into v_emp;
            while(c%found) loop
                    dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
                    fetch c into v_emp;
            end loop;
    close c;
end;






 
declare
    cursor c is select * from emp;
--v_emp%rowtype --不用声明
begin
    for v_emp in c loop
            dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
    end loop;
end;






--带参数的游标
declare
    cursor c(v_deptno emp.deptno%type,v_job emp.job%type) is
            select ename,sal from emp where deptno = v_deptno and job = v_jo


  begin
    for v_temp in c(30,'SALESMAN') loop
            dbms_output.put_line(v_temp.sal||' '||v_temp.ename);
    end loop;
  end;






--可更改的游标(不常用)
declare
cursor c is select * from emp2 for update;
begin
for v_temp in c loop
if(v_temp.sal<2000) then
update emp2  set sal = sal*2 where current of c;
elsif(v_temp.sal=5000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end;
 


--引用游标
declare
        type ref_cursor is ref cursor;        --定义引用游标类型
        c ref_cursor;                         --定义变量
        v_deptno emp.deptno%type;
        v_ename emp.ename%type;
        v_sal emp.sal%type;
begin
        v_deptno:=10;                         --为变量赋值
        open c for select ename,sal from emp where deptno = v_deptno;--将游标指向集合
        loop                                 --循环
            fetch c into v_ename,v_sal;
            exit when(c%notfound);
            dbms_output.put_line(v_ename||':'||v_sal);
        end loop;
        close c;
end;
/



o、存储过程


--创建无参数存储过程
create or replace procedure p
is
cursor c is select * from emp2 for update;
begin
for v_emp in c loop
if(v_temp.deptno=10) then
update emp2 set sal=sal+10 where current of c;
elsif(v_temp.deptno=20) then
update emp2 set sal=sal+20 where current of c;
else
update emp2 set sal=sal+30 where current of c;
end if;
end loop;
commit;
end;
--执行1
exec p;
--执行2
begin
p;
end;
--显示错误
show error;



--创建带参数的存储过程
create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp+1;
end;
--执行
declare
v_a number := 10;
v_b number := 100;
v_ret number;
v_temp number := 1;
begin
p(v_a,v_b,v_ret,v_temp);
  dbms_output.put_line(v_ret);
  dbms_output.put_line(v_temp);
end;
 




p、函数


create or replace function 名字(
        参数1  类型,
        参数2 类型
)
        return number
is
        变量1 类型;
        变量2 类型;
begin
exception
end;




--创建函数
create or replace function sal_tax
(v_sal number)
return number
is
begin
if(v_sal < 2000) then
return 0.1;
elsif(v_sal < 2750) then
return 0.15;
else
return 0.20;
end if;
end;
--调用函数
select lower(ename),sal_tax(sal) from emp;






--创建函数
create or replace function f_1(
        v_empno number
)
return number
is
        v_sal emp.sal%type;
begin
        select sal into v_sal  from emp where empno = v_empno;
        return v_sal;
end;
--调用函数
select empno,f_1(empno) from emp;




q、触发器
参考网址:http://blog.csdn.net/indexman/article/details/8023740/


create or replace trigger trig
    after insert or delete or update on emp2
--before insert or delete or update on emp2
--after insert or delete or update on emp2 for each row
begin
    if inserting then
            dbms_output.put_line('insertint......');
    elsif updating then
            dbms_output.put_line('updating......');
    elsif deleting then
            dbms_output.put_line('deleting......');
    end if;
end;
 




create  table emp2_log
  (
    uname nvarchar2(50),
    action varchar2(50),
    time date
   )


create or replace trigger trig
            after insert or delete or update on emp2 for each row
begin
            if inserting then
                    insert into emp2_log values(user,'insert',sysdate);
            elsif updating then
                    insert into emp2_log values(user,'update',sysdate);
            elsif deleting then
                    insert into emp2_log values(user,'delete',sysdate);
            end if;
end;



--建立一个触发器, 当职工表 emp2 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
create table emp_log
as
select * from emp2 where 1=2;


select * from emp_log;


create or replace trigger t_1
before delete on emp2 for each row
begin
  insert into emp_log(deptno,empno,ename,job,mgr,sal,comm,hiredate )
  values(:old.deptno,:old.empno,:old.ename,:old.job,:old.mgr,:old.sal,:old.comm,:old.hiredate );
end;
/
select * from emp2;
delete from emp2;
--建立一个触发器,修改dept2中编号10修改成11的之后,emp2引用的10也修改成11
create or replace trigger t_2
after update of deptno on dept2 for each row
begin
  update emp2 set deptno = :new.deptno  where  deptno = :old.deptno;
end;
/


update dept2 
set deptno = 11
where deptno = 10;


select * from emp2;
select * from dept2;


--包
包用于在逻辑上组合过程和函数和游标,它由包规范和包体两部分组成


--创建包头
create or replace package p1
is
       procedure pro(v_empno in number,v_sal out number);
       function fun(v_empno number) return number;
end;
/
--创建包体
create or replace package body p1
is
       procedure pro(v_empno in number,v_sal out number)
       is
       begin
           select  sal into v_sal from emp where empno = v_empno;
       end;
       function fun(v_empno number) return number
       is
             v_sal emp.sal%type;
       begin
             select  sal into v_sal from emp where empno = v_empno;
             return v_sal;
       end;
end;
/
--调用包里的存储过程,"包名.过程的名字"
declare
       v_empno emp.empno%type;
       v_sal emp.sal%type;
begin
       v_empno:=7566;
       p1.pro(v_empno,v_sal);
       dbms_output.put_line('v_sal:'||v_sal);
end;
/
--调用包里的函数,"包名.函数名"
declare
       v_empno emp.empno%type;
       v_sal emp.sal%type;
begin
       v_empno:=7566;
       v_sal:=p1.fun(v_empno);
       dbms_output.put_line('v_sal:'||v_sal);
end;
/


/****************创建存储过程,将引用型游标作为输出类型案例*****************/


--创建包头
create or replace package p2 is
       type ref_cursor is ref cursor;             --引用游标类型
end;
/
--创建过程
create or replace procedure p(
      v_deptno in number,
      v_c out p2.ref_cursor
)
is
begin
     open v_c for select ename,sal from emp where deptno = v_deptno;
end;
/
--调用测试
declare
      v_deptno emp.deptno%type:=10;
      v_c  p2.ref_cursor;
      v_ename emp.ename%type;
      v_sal emp.sal%type;
begin
      p(v_deptno,v_c);
      fetch v_c into v_ename,v_sal;
      dbms_output.put_line(v_ename||':'||v_sal);
end;
/


/***分页的存储过程***/
--创建包头
create or replace package package_page is
       type ref_cursor is ref cursor;              --引用游标类型
end;
/
--创建存储过程
create or replace procedure proc_page(
       v_pageNow       number,                        --当前页码
       v_pageSize      number,                        --每页显示的条数
       v_pageResource  varchar2,                      --查询的内容
       
       v_pageCount out number,                        --总页数
       v_pagRows    out number,                       --总记录数
       v_c out package_page.ref_cursor                --每页显示的数据集
)
is
       v_lt number(20);                               --小于的值
       v_mt number(20);                               --大于的值
begin
        /*计算总记录数*/
        execute immediate 'select count(*) from ('|| v_pageResource ||')' into v_pagRows;
        /*根据总记录数和每页显示的条数可以计算出总页数*/
        v_pageCount := ceil(v_pagRows/v_pageSize);
        /*计算小于和大于*/
        v_lt := v_pageNow*v_pageSize+1;
        v_mt := (v_pageNow-1)*v_pageSize;
        /*求数据集*/
        open v_c for 'select * from(select t.*,rownum rn from('
                 ||v_pageResource||') t where rownum<'
                 ||v_lt||') where rn>'||v_mt;
end;
/  
 


 




































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值