分类:
Oracle
```csharp Oracle 基础知识了解 Oracle 最早员工主管 Kinq 默认账户 Sys 123456 as sysdba System 123456 dba(数据库管理员) Scott tiger(养猫的名字) (Oracle 公司的第一个员工) Oracle 公司的三个认证 Oca:oracle 初级认证 Ocp:Oracle企业级认证,终极认证 Ocm : oracle 大师级认证(Oracle 总部) Oracle 授权命令 grant 权限/角色 to 用户名 Oracle 撤销命令 revoke 权限 from 用户名 授予权限Create session 和角色DBA 给数据库管理员 grant create session ,dba to teacher; teacher -- 是数据库管理员 Oracle 常用命令 查询当前登录的用户 Show user 登录命令/切换账户的命令 Conn 用户名/密码 锁定账户命令 alter user 用户名 account lock 解锁账户命令 alert user 用户名 account unlock 修改密码 alert user 用户名 identified 密码 回退事务 Rollback; 授权命令 Grant 权限 to 用户名 scott 查询权限 给Scott查询test 表的权限 grant select on test to scott 给Scott添加test 表的权限 grant insert on test to scott 给Scott删除test 表的权限 grant delete on test to scott 取消Scott查询test 表的权限 revoke select on test to scott 总结:查询用grant ,取消用revoke。 Oracle权限传递 权限传递前提: 1.自己具有该权限。 2.权限配置的权限 with admin option(系统权限) with grant option(对象权限) 权限的回收 如果对象权限会取消,如果是系统权限不会连带取消 查询角色拥有的各种权限 -- 查询所有的角色 select * from dba.roles; -- 查询某个角色的系统权限 select * from dba_sys_privs where grantee='DBA'; 查询某个角色的对象权限 select * from dba_tab_privs where grantee='DBA'; 查询某个角色的角色权限 select * from dba_role_privs where grantee='DBA'; select * from dba_role_pr 给Scott查询test 表的权限 grant select on test to scott grant select on test to scott 开启控制器输出 set serveroutput on; 序列的应用 创建序列 create sequence seq start with 2 --从2开始 increment by 2 -- 自增 2 查询序列 select seq.nextval from dual; 修改序列的最大值 alter sequence seq maxvalue 50 -- 最大值为50 让序列循环起来 alter sequence seq maxvalue 50 -- 最大值为50 cycle -- 循环 让序列无限增长 alter sequence seq increment by 4 -- 自增 2 nomaxvalue -- 最大值为50 nocycle -- 循环 Oracle 的if判断 declare i int:=1; begin if i=1 then dbms_output.put_line('小明') ; end if; end; Oracle的 loop循环 declare i int:=1; begin loop dbms_output.put_line(i) ; i:=i+1; exit when i>=20; end loop; end; Oracle的 while循环 declare i int:=1; begin while i<20 loop dbms_output.put_line(i) ; i:=i+1; end loop; end; Oracle的 for循环 declare i int:=1; begin for i in 1..20 loop dbms_output.put_line(i) ; end loop; end; Oracle 的 switch 判断 declare i int:=1; begin case i when 10 then dbms_output.put_line(10) ; when 20 then dbms_output.put_line(20) ; when 30 then dbms_output.put_line(30) ; else dbms_output.put_line('数字不存在') ; end case; end; 建立一个不带参数的时间存储过程 create or replace procedure time_out is begin dbms_output.put_line(systimestamp); end; 建立一个带有输出参数的存储过程 create or replace procedure add_employee (EMPNO NUMBER(4),ENAME VARCHAR2(10) ,JOB VARCHAR2(9),MGR NUMBER(4), ,HIREDATE DATE , SAL NUMBER(7,2) ,COMM NUMBER(7,2),DEPTNO NUMBER(2)) is begin insert into scott.emp values (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO ) end ; 如何创建带out参数的存储过程 create or replace procedure testOut(values1 number ,values2 out number) is begin values2:=values1+50; end; 调用存储过程 declare result number; begin testOut(10,result); DBMS_OUTPUT.put_line(result); end; 查看表结构 desc scott.emp; 实例: Name Type Nullable Default Comments -------- ------------ -------- ------- -------- EMPNO NUMBER(4) ENAME VARCHAR2(10) Y JOB VARCHAR2(9) Y MGR NUMBER(4) Y HIREDATE DATE Y SAL NUMBER(7,2) Y COMM NUMBER(7,2) Y DEPTNO NUMBER(2) Y 创建函数 create or replace function get_user return varchar2 is v_user varchar2(100); begin select ename into v_user from scott.emp where empno='7369'; return v_user; end; 使用变量接收函数返回值。 declare username varchar2(50); begin username:=get_user; dbms_output.put_line(username); end; 调用方法: 1. SQL 语句中直接调用函数。 SQL> select get_user from dual; GET_USER -------------------------------------------------------------------------------- SMITH SQL> 创建索引 create unique index indeEMPNO on scott.emp(EMPNO); 创建位图索引 create bitmap index indeJob on scott.emp(job); 修改索引 1.重建索引。 alter index indeJob rebuild; rebuild -- 重建 2. 合并索引 alter index indeJob coalesce; coalesce -- 合并 删除视图 drop index indeJob ; 创建视图 create view view_employee as select * from scott.emp; 删除视图 drop view view_employee; 创建私有同义词 create synonym myemp for scott.emp; 创建公有同义词 create public synonym public_myemp for scott.emp; 删除同义词 drop synonym myemp; 函数的使用 1.ABS(n).该函数用于返回数字n的绝对值。 select 'ABS:'|| ABS(-12.3) from dual; 结果: 'ABS:'||ABS(-12.3) ------------------ ABS:12.3 2.CEIL(n)。返回大于数字n的最小整数。 select 'CEIL:'|| CEIL(-12.3) from dual; select 'CEIL:'|| CEIL(12.3) from dual; select 'CEIL:'|| CEIL(12) from dual; 返回结果: 'CEIL:'||CEIL(-12.3) -------------------- CEIL:-12 'CEIL:'||CEIL(12.3) ------------------- CEIL:13 'CEIL:'||CEIL(12) ----------------- CEIL:12 3.FLOOR(n) .返回小于等于数字n 的最大整数。 select 'FLOOR:'|| FLOOR(-12.3) from dual; select 'FLOOR:'|| FLOOR(12.3) from dual; select 'FLOOR:'|| FLOOR(12) from dual; 返回结果: 'FLOOR:'||FLOOR(-12.3) ---------------------- FLOOR:-13 'FLOOR:'||FLOOR(12.3) --------------------- FLOOR:12 'FLOOR:'||FLOOR(12) ------------------- FLOOR:12 4.ROUND(n,[m]).四舍五入。如果省略吗,则四舍五入至整数,如果m是负数,则四舍五入到小数点前m位;如果m是正数,则四舍五入至小数点m位。 select 'ROUND:'|| ROUND(-12.32344,2) from dual; 返回结果: 'ROUND:'||ROUND(-12.32344,2) ---------------------------- ROUND:-12.32 5.TRUNC(n,[m]).截取数字。如果省略吗,则截取至整数,如果m是负数,则截取到小数点前m位;如果m是正数,则截取至小数点m位。 select 'TRUNC:'|| TRUNC(-12.32344,2) from dual; 结果: 'TRUNC:'||TRUNC(-12.32344,2) ---------------------------- TRUNC:-12.32 字符函数 LOWER(char) 。将字符串转化为小写格式。 UPPER(char)。 将字符串转化为大写格式。 LENGTH(char)。返回字符串的长度。 LTRIM(char[,set])。去掉字符串char左端包含的set中的任何字符。set默认为空格。 使用LTRIM()函数。 select 'LTRIM:'|| LTRIM('this is') from dual; select 'LTRIM:'|| LTRIM('this is','th') from dual; 结果: 'LTRIM:'||LTRIM('THISIS') ------------------------- LTRIM:this is 'LTRIM:'||LTRIM('THISIS','TH') ------------------------------ LTRIM:is is 使用RTRIM()函数。 select 'RTRIM:'|| RTRIM('this is') from dual; select 'RTRIM:'|| RTRIM('this is','th') from dual; 结果: 'RTRIM:'||RTRIM('THISIS') ------------------------- RTRIM:this is 'RTRIM:'||RTRIM('THISIS','TH') ------------------------------ RTRIM:this is 使用REPLACE()函数。 select 'REPLACE:'|| REPLACE('this a apple','this','that') from dual; 返回结果: 'REPLACE:'||REPLACE('THISAAPPL ------------------------------ REPLACE:that a apple 转化函数 1.使用TO_NUMBER()函数。 select 'TO_NUMBER:'|| TO_NUMBER('100.33','99999D99') from dual; 返回结果: 'TO_NUMBER:'||TO_NUMBER('100.3 -------------------------------------------------- TO_NUMBER:100.33 2.使用TO_CHAR()函数。 select 'TO_CHAR:'|| TO_CHAR(sysdate,'yyyy-MM-dd') from dual; 返回结果: 'TO_CHAR:'||TO_CHAR(SYSDATE,'Y ------------------------------ TO_CHAR:2019-12-27 3.使用TO_DATE()函数 select 'TO_DATE:'|| TO_DATE('05-03-10','mm-dd-yy') from dual; 返回结果: 'TO_DATE:'||TO_DATE('05-03-10' ------------------------------ TO_DATE:03-5月 -10 4.使用NVL()函数。NVL(expr1,expr2),如果expr1是NULL,则返回expr2;否则返回expr1。两者的数据类型必须要匹配。 select 'NVL:'|| NVL(comm,0) from scott.emp where empno=7369; 返回结果: 'NVI:'||NVL(COMM,0) -------------------------------------------- NVI:0 4.使用NVL2()函数。NVL2(expr1,expr2,expr3),如果expr1是NULL,则返回expr3;否则返回expr2。两者的数据类型可以不匹配。 select 'NVL2:'|| NVL2(comm,0,1) from scott.emp where empno=7369; 返回结果: 'NVL2:'||NVL2(COMM,0,1) --------------------------------------------- NVL2:1 5.使用replace 函数 select 'replace'|| replace('kb0932o9312il93111','o','0') from dual select replace((select replace('kb0932o9312il93111','o','0') from dual),'i','1') from dual 返回结果: 'REPLACE'||REPLACE('KB0932O931 ------------------------------ replacekb093209312il93111 REPLACE((SELECTREPLACE('KB0932 ------------------------------ kb0932093121l93111 多表查询 SQL的集合操作符。 UNION :返回查询检索的所有不重复的行。 UNION ALL :返回查询检索的所有行,包括重复行。 INTERSECT:返回两个查询都检索到的行 MINUS: 返回第一个检索到的行减去第二个查询检索的行所剩余的行 连接查询 使用内连接 select * from scott.dept,scott.emp where dept.deptno=emp.deptno; select * from scott.dept a inner join scott.emp b on a.deptno=b.deptno and a.deptno=20; 使用自连接 select manager.ename from scott.emp manager,scott.emp worker where manager.empno=worker.mgr and worker.ename='smith'; 使用左外连接。 select * from scott.dept a left join scott.emp b on a.deptno=b.deptno and a.deptno=20; 使用右外连接。 select * from scott.dept a right join scott.emp b on a.deptno=b.deptno and a.deptno=20; 说明一个完整的PL/SQL块 declare v_ename varchar2(20); begin select ename into v_ename from scott.emp where empno=&empno; DBMS_OUTPUT.put_line('员工姓名:' || v_ename); exception when no_data_found then dbms_output.put_line('请输入正确的员工号!'); end; 输出结果: 员工姓名:SMITH PL/SQL procedure successfully completed 计算员工的工资所得税 declare v_ename varchar2(20); v_sal number(6,2); c_tax_rate constant number(3,2):=0.03; v_tax_sal number(6,2); begin select ename,sal into v_ename,v_sal from scott.emp where empno=&empno; v_tax_sal :=v_sal * c_tax_rate; dbms_output.put_line('员工姓名:'||v_ename); dbms_output.put_line('员工工资:'||v_sal); dbms_output.put_line('所得税:'||v_tax_sal); end; 输出结果: SQL> / 员工姓名:SMITH 员工工资:800 所得税:24 PL/SQL procedure successfully completed 使用%type属性计算员工的工资所得税 declare v_ename scott.emp.ename%type; v_sal number(6,2); c_tax_rate constant number(3,2):=0.03; v_tax_sal number(6,2); begin select ename,sal into v_ename,v_sal from scott.emp where empno = &empno; v_tax_sal :=v_sal * c_tax_rate; dbms_output.put_line('员工姓名:'||v_ename); dbms_output.put_line('员工工资:'||v_sal); dbms_output.put_line('所得税:'||v_tax_sal); end; 输出结果: 员工姓名:SMITH 员工工资:800 所得税:24 PL/SQL procedure successfully completed 条件分支语句 declare v_dep number(6,2); v_sal number(6,2); begin select deptno ,sal into v_dep,v_sal from scott.emp where ename=trim('JAMES'); if v_dep=10 then update scott.emp set sal=v_sal+200 where deptno=10; elsif v_dep=20 then update scott.emp set sal=v_sal+100 where deptno=20; elsif v_dep=30 then update scott.emp set sal=v_sal+50 where deptno=30; else update scott.emp set sal=v_sal+20 where deptno!=10 and deptno!=20; end if; end; 游标 1.显示游标 declare cursor cursor_name is select 123 from dual; begin open cursor_name; dbms_output.put_line('你好,很热!'); close cursor_name; end; 输出结果: SQL> ed SQL> / 你好,很热! PL/SQL procedure successfully completed 2.使用游标提取部门20名员工的姓名与工资 declare cursor emp_cursor is select ename,sal from scott.emp where deptno=20; v_ename scott.emp.ename%type; v_sal scott.emp.sal%type; begin open emp_cursor; loop fetch emp_cursor into v_ename ,v_sal; exit when emp_cursor%Notfound; dbms_output.put_line(v_ename||':'||v_sal); end loop; close emp_cursor; end; 运行结果如下: SQL> set serveroutput on; SQL> / FORD3:3000 SMITH:800 JONES:2975 SCOTT:3000 ADAMS:1100 FORD:3000 PL/SQL procedure successfully completed 参数游标 declare cursor emp_cursor(cno number) is select ename ,sal from scott.emp where deptno=cno; v_ename scott.emp.ename%type; v_sal scott.emp.sal%type; begin if not emp_cursor %isopen then open emp_cursor(10); end if; loop fetch emp_cursor into v_ename,v_sal; exit when emp_cursor%notfound; dbms_output.put_line(v_ename||':'||v_sal); end loop; close emp_cursor; end; 输出结果: CLARK:2450 KING:5000 MILLER:1300 PL/SQL procedure successfully completed 使用游标删除或更新数据 将工资低于2500的员工增加150元工资 declare cursor emp_cursor is select ename,sal from scott.emp for update of sal; v_ename scott.emp.ename%type; v_oldsal scott.emp.sal%type; begin open emp_cursor; loop fetch emp_cursor into v_ename,v_oldsal; exit when emp_cursor%notfound; if v_oldsal<2500 then update scott.emp set sal=sal+150 where current of emp_cursor; end if; end loop; close emp_cursor; end; 使用游标for循环显示部门编号为20的所有员工姓名 declare cursor emp_cursor is select ename from scott.emp where deptno=20; begin for emp_record in emp_cursor loop dbms_output.put_line('第'||emp_cursor%rowcount||'个员工'||emp_record.ename); end loop; end; 运行结果: 第1个员工FORD3 第2个员工SMITH 第3个员工JONES 第4个员工SCOTT 第5个员工ADAMS 第6个员工FORD PL/SQL procedure successfully completed 在游标for循环中使用子循环显示部门编号20的所有员工姓名 begin for emp_record in (select ename from scott.emp where deptno=20) loop dbms_output.put_line(emp_record.ename); end loop; end; 输出结果: SQL> ed SQL> / FORD3 SMITH JONES SCOTT ADAMS FORD PL/SQL procedure successfully completed 建立before语句触发器,保证员工信息的修改只能在工作时间。 create or replace trigger tr_sec_emp before insert or update or delete on scott.emp declare begin if to_char(susdate,'dy','bls_date_language=AMERICAN') IN ('sat','sum') then raise_application_error(-20001,'今天是休息时间,不能改变员工信息'); end if; end tr_sec_emp; 使用dbms_output 包输出99乘法表 begin dbms_output.put_line('打印久久乘法表'); for i in 1..9 loop for j in 1..i loop dbms_ouput.put_line(i||'*'j||'='||i*j); dbms_ouput.put_line(' '); end loop; dbms_output.new_line; end loop; end; 输出结果: SQL> set serverout on; SQL> / 打印久久乘法表 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 PL/SQL procedure successfully completed ```
评价
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术