Oracle学习
来源:互联网 发布:《电力网络》 编辑:程序博客网 时间:2024/06/05 02:12
知识点1
1.1用户登录
显示当前用户:show user普通用户登录:conn system/abc123;sys用户登录:conn sys/abc123 as sysdba;断开连接:disconn退出Oracle数据库:exit
1.2oracle服务
doc命令下-启动Oracle服务:net start oracleserviceorcldoc命令下-关闭Oracle服务: net stop oracleserviceorcl
1.3账户操作
创建用户(system用户可以创建其它用户):create user test identified by abc123;给用户授予权限(system用户可以给其它用户授权):grant connect,resource to test;锁账户(只有高一级账户可以操作):alter user test account lock;解锁账户(只有高一级账户可以操作)alter user test account unlock;修改用户密码(高级账户或账户本身可以修改):alter user system identified by abc123
1.4远程登录数据库
conn system/abc123@10.1.59.5:1521/orclconn sys/abc123@10.1.59.5:1521/orcl as sysdba
知识点2
2.1表空间文件
说明select name,bytes,status from v$datafile;说明select name from v$controlfile;说明select group# from v$logfile;说明select name from v$database;
2.2将sql语句进行记录
spool E:test1.txt......spool off
2.3表空间相关操作
创建表空间:create tablespace testcuck datafile 'E:/testcuck01.dbf' size 10m autoextend on next 10m maxsize 1G;更改表空间:alter tablespace testcuck add datafile 'E:/testcuck03.dbf' size 10m;删除表空间:drop tablespace tptest including contents and datafiles;
2.4表空间应用
create table t_user(uiid char(6) primary key,uname varchar(20) not null,ubirthday date,usex char(1) check(usex in('男','女')),uaddress varchar2(50),utelephone varchar2(20))TABLESPACE shoppingtppctfree 8 --注册用户表中,注册用户的信息修改的次数一般比较少,所以设置8%的数据块可用空间用于update。pctused 40 --注册用户表中,注册用户的信息很多,所以设置40%,使得数据块的数据低于40%时可以插入新的数据。STORAGE ( INITIAL 100M --初始值设定为100M NEXT 50M --NEXT设置为50M);
PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update;即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期。 PCTUSED:是指当块里的数据低于多少百分比时,又可以重新被insert,一般默认是40,即40%,即:当数据低于40%时,又可以写入新的数据,这个时候处在下降期。
知识点3
知识点4(函数)
应用1
create or replace function f_tax(i_sal in number) return numberas salary number(10,2);begin salary:=i_sal; salary:=salary-3500; if salary<=0 then return (0); elsif salary<=1500 then return (salary*0.03); elsif salary<=4500 then return (salary*0.1-105); elsif salary<=9000 then return (salary*0.2-555); elsereturn (salary*0.45-13505); end if;end;/show error;select f_tax(5000) from dual;
知识点5
知识点6
6.1查询存储过程
查询当前用户下存储过程的名称select object_name from user_objects where object_type='PROCEDURE';查询存储过程源码select text from user_source where type='PROCEDURE' and name='P_INSERTORDERITEMS';
6.2查询函数
查询当前用户下函数的名称select object_name from user_objects where object_type='FUNCTION';
知识点7(存储过程)
应用1
打印输出员工的信息(姓名,工资,入职时间)create or replace procedure p_printemp(i_empid number)asv_name employees.first_name%type;v_sal employees.salary%type;v_hdate employees.hire_date%type;begin select first_name,salary,hire_date into v_name,v_sal,v_hdate from employees where employee_id=i_empid; dbms_output.put_line(v_name||'.'||v_sal||'.'||v_hdate);exception when no_data_found then dbms_output.put_line('您输入的编号不存在');end;/show error;set serveroutput on;exec p_printemp(123);
应用2
打印输出员工的信息(姓名,工资,入职时间)create or replace procedure p_printemp(i_deptid number)asv_name employees.first_name%type;v_sal employees.salary%type;v_hdate employees.hire_date%type;cursor cur_emp is select first_name,salary,hire_date into v_name,v_sal,v_hdate from employees where department_id=i_deptid; --定义游标begin open cur_emp; --打开游标 fetch cur_emp into v_name,v_sal,v_hdate; while (cur_emp%found) loop dbms_output.put_line(v_name||'.'||v_sal||'.'||v_hdate); fetch cur_emp into v_name,v_sal,v_hdate; end loop; close cur_emp;exception when no_data_found then dbms_output.put_line('您输入的编号不存在');end;/show error;set serveroutput on;exec p_printemp(1);
应用3
打印输出员工的信息(*)create or replace procedure p_printemp(i_deptid number)ascursor cur_emp is select * from employees where department_id=i_deptid; --定义游标rec_emp cur_emp%rowtype;--游标的行记录类型begin open cur_emp; --打开游标 fetch cur_emp into rec_emp; while (cur_emp%found) loop dbms_output.put_line(rec_emp.last_name||'.'||rec_emp.salary||'.'||rec_emp.email); fetch cur_emp into rec_emp; end loop; close cur_emp;exception when others then dbms_output.put_line('error'||','||sqlerrm);end;/show error;set serveroutput on;exec p_printemp(1);
应用4
create or replace procedure p_printemp(i_deptid number)ascursor cur_emp is select * from employees where department_id=i_deptid; --定义游标begin for rec_emp in cur_emp loop dbms_output.put_line(rec_emp.last_name||'.'||rec_emp.salary||'.'||rec_emp.email); end loop;exception when others then dbms_output.put_line('error'||','||sqlerrm);end;/show error;set serveroutput on;exec p_printemp(100);
应用5
create or replace procedure p_printemp(i_deptid number)ascursor cur_emp(deptno number) is select * from employees where department_id=deptno; --定义游标rec_emp cur_emp%rowtype;--游标的行记录类型begin open cur_emp(i_deptid); --打开游标 fetch cur_emp into rec_emp; while (cur_emp%found) loop dbms_output.put_line(rec_emp.last_name||'.'||rec_emp.salary||'.'||rec_emp.email); fetch cur_emp into rec_emp; end loop; close cur_emp;exception when others then dbms_output.put_line('error'||','||sqlerrm);end;/show error;set serveroutput on;exec p_printemp(100);
应用6
create or replace procedure p_printdeptandempas cursor cur_dept is select * from departments; cursor cur_emp(deptno number) is select * from employees where department_id=deptno; rec_dept cur_dept%rowtype; rec_emp cur_emp%rowtype;begin open cur_dept; fetch cur_dept into rec_dept; while (cur_dept%found) loop dbms_output.put_line('部门'||rec_dept.department_id||'.'||rec_dept.department_name||'.'||rec_dept.location_id); for rec_emp in cur_emp(rec_dept.department_id) loop dbms_output.put_line(' 员工'||rec_emp.employee_id||'.'|| rec_emp.first_name||'.'||rec_emp.salary); end loop; fetch cur_dept into rec_dept; end loop; close cur_dept;Exception when others then dbms_output.put_line('error'||','||sqlerrm);end;/show error;exec p_printdeptandemp;
自定义异常
declaree_datanotnull exception;pragma exception_init(e_datanotnull,-01400);begin insert into departments values(301,null,null,null);exception when e_datanotnull then dbms_output.put_line('数据不能为空'); when others then dbms_output.put_line('error');end;
用户自定义异常
declaree_datanotnull exception;pragma exception_init(e_datanotnull,-01400);v_location number;v_dept number;e_depttoohigh exception;begin v_location:=&地址编号; v_dept:=&部门编号; --部门编号不能大于10000 if v_dept>10000 then raise e_depttoohigh; end if; insert into departments values(v_dept,'neusoft',null,v_location);exception when e_datanotnull then dbms_output.put_line('数据不能为空'); when e_depttoohigh then dbms_output.put_line('编号太大'); when others then dbms_output.put_line('error');end;
知识点8(触发器)
插入
create or replace trigger tr_checkpitemsinsertbefore insert on t_procure_itemsfor each rowdeclare v_state t_main_procure.pstate%type;begin select pstate into v_state from t_main_procure where pmid=:new.pmid; if v_state<>'1' then raise_application_error('-20001','该单据已经审核,不能添加'); end if;end;/show error;
%rowtype:代表一行记录/*触发器*/:new:1)insert操作中,添加的行记录2)update操作中更新以后的行记录:old:1)delete操作中,删除的行记录2)update操作中更新以前的行记录
删除
create or replace trigger tr_checkpitemsdeletebefore delete on t_procure_itemsfor each rowdeclare v_state t_main_procure.pstate%type;begin --判断所删除的明细数据的单据是否是待审核 select pstate into v_state from t_main_procure where pmid=:old.pmid; if v_state<>'1' then raise_application_error('-20001','该单据已经审核,不能再删除'); end if;end;delete from t_procure_items where pmid='P20170800001' and gid='g0003';
更新
create or replace trigger tr_checkpitemsupdatebefore update on t_procure_itemsfor each rowdeclare v_state t_main_procure.pstate%type;begin --判断所更新的明细数据的单据是否是待审核 select pstate into v_state from t_main_procure where pmid=:old.pmid; if v_state<>'1' then raise_application_error('-20001','该单据已经审核,不能再更新'); end if;end;update t_procure_items set piprice=20 where pmid='P20170800001';
多个触发器合并
create or replace trigger tr_checkpitemsbefore update or insert or update on t_procure_itemsfor each rowdeclare v_state t_main_procure.pstate%type;begin if inserting then select pstate into v_state from t_main_procure where pmid=:new.pmid; elsif updating or deleting then select pstate into v_state from t_main_procure where pmid=:old.pmid; end if; if v_state<>'1' then raise_application_error('-20001','该单据已经审核,无法进行添加、删除和修改'); end if;end;测试添加:insert into t_procure_items values('P20170700001','g0002',10,3,30,null);测试修改:update t_procure_items set piprice=40 where pmid='P20170800001';测试删除:delete from t_procure_items where pmid='P20170800002';commit;rollback;
应用
create or replace trigger cr_addchangesalafter update of salary on employees for each rowbegin --判断员工工资是否发生改变 if :old.salary<>:new.salary then insert into re_changeSal values(sqp_emppid.nextval,:old.employee_id,:old.salary,:new.salary,default,user);--user代表当前登录用户 end if;end;/show error;
作业
1)实现采购单明细数据的添加程序/* 存储过程名称:p_insertprocureitems 输入参数: i_pmid(采购编号); i_gid(商品编号); i_piprice(采购单价); i_pinum(采购数量); 输出参数: i_result: 1(添加成功); -1(数据不存在); 创建人:cuckoo 创建日期:2017.07.31 修改:cuckoo*//*存储过程*/create or replace procedure p_insertprocureitems(i_pmid in t_main_procure.pmid%type, --采购编号 i_gid in t_goods.gid%type, --商品编号 i_piprice in number default 0, --采购单价 i_pinum in number default 1, --采购数量 i_result out number --输出参数) as v_count number:=0; begin --检查采购单编号是否正确 select count(pmid) into v_count from t_main_procure where trim(pmid)=trim(i_pmid); if v_count=0 then i_result:=-1; return; --不存在采购单编号,退出程序 end if; --检查商品编号是否正确 select count(gid) into v_count from t_goods where trim(gid)=trim(i_gid); if v_count=0 then i_result:=-1; return; --不存在商品编号,退出程序 end if; insert into t_procure_items values(i_pmid,i_gid,i_piprice,i_pinum,i_piprice*i_pinum,null); i_result:=1; commit;exception when others then i_result:=sqlcode; rollback; end;/show error;set serveroutput on/*调用存储过程*/declarev_result number;begin p_insertprocureitems('p20170700006','g0002',10,3,v_result); if v_result=1 then dbms_output.put_line('添加订单明细成功'); elsif v_result=-1 then dbms_output.put_line('数据错误或不存在'); else dbms_output.put_line('error'||','||v_result); end if; end;--------------------------------------------------------------2)实现对订单商品的评价功能/*评价表主键自增函数*/create or replace function e_createueid return varchar asf_createueid varchar2(10);f_maxid t_user_evaluation.ueid%type;begin f_createueid:='P'||to_char(sysdate,'yyyymm'); select max(ueid) into f_maxid from t_user_evaluation where to_char(uedate,'yyyymm')=to_char(sysdate,'yyyymm'); if f_maxid is null then f_createueid:=f_createueid||'001'; else f_createueid:=f_createueid||trim(to_char(to_number(substr(f_maxid,8,5))+1,'000')); end if; return f_createueid;end;/* 存储过程名称:insertevaluation 输入参数: e_omid(订单编号); e_gid(商品编号); 输出参数: e_result: 1(添加成功); -1(数据不存在); 创建人:cuckoo 创建日期:2017.07.31 修改:cuckoo*/create or replace procedure insertevaluation(e_omid in t_order_items.omid%type,--订单编号 e_gid in t_order_items.gid%type,--商品编号 e_result out number) as v_count number:=0; begin --检查订单编号是否正确 select count(omid) into v_count from t_main_order where trim(omid)=trim(e_omid); if v_count=0 then e_result:=-1; return; --订单编号不存在,退出程序 end if; --检查商品编号是否正确 select count(gid) into v_count from t_goods where trim(gid)=trim(e_gid); if v_count=0 then e_result:=-1; return; --商品编号不存在,退出程序 end if; insert into t_user_evaluation values(e_createueid(),e_omid,e_gid,sysdate,'A','abc'); e_result:=1; commit;exception when others then e_result:=sqlcode; rollback; end;/show error;set serveroutput ondeclarev_result number;begin insertevaluation('O20170700012','g0001',v_result); if v_result=1 then dbms_output.put_line('添加成功'); elsif v_result=-1 then dbms_output.put_line('数据不存在'); else dbms_output.put_line('error'||','||v_result); end if; end;
阅读全文
0 0
- 【oracle学习】oracle安装
- [oracle学习] oracle 数据类型
- 【Oracle】Oracle基础学习
- 学习oracle-认识oracle
- oracle学习
- Oracle学习
- oracle 学习
- oracle学习
- ORACLE学习
- 学习Oracle
- 学习Oracle
- oracle学习
- Oracle 学习
- oracle学习
- ORACLE 学习
- 学习Oracle
- Oracle学习
- oracle 学习
- Molar Mass—Uva1586
- 《机器学习实战》——决策树的构造及案例
- HTML
- 华为java面试题目
- c# 数组
- Oracle学习
- Annotation-->@FunctionalInterface
- ACM测试程序时,怎样从文件中读入,以及怎样将结果读出到文件(附带可运行代码)
- django的用户认证
- 欢迎使用CSDN-markdown编辑器
- 技术选型
- Tornado框架知识系列之四
- STM32串口多机通信(认识2)
- LintCode:二叉树的路径和