-- 一章节 1.日期函数 add_months() extract() round() trunc() last_day() next_day() 2.转换函数 to_date() to_char() to_number() 3.锁 行级锁: 1.自动上锁 insert update delete select...for update 表级锁: 1.手动锁 lock table emp in share mode; 1.同义词 grant create synonym to aniu; create synonym emp for scott.emp; create synonym e for emp; grant create public synonym to aniu; create public synonym pe for scott.emp; --查看同义词 select * from user_synonyms;--数据字典 2.序列 create sequence seq start with 1 increment by 2 maxvalue 30 minvalue -5 nocycle --不循环产生序列号 cache 5; --修改 alter sequence seq cycle; --序列位列 1.nextval:序列下一个值 select seq.nextval from dual; 2.currval:序列当前值 select seq.currval from dual; create table test(i number(6)); insert into test values(seq.nextval); --查看序列 desc user_sequences; select SEQUENCE_NAME from user_sequences; 3.视图 --普通视图 grant create any view to scott;--授权 create or replace view v1 as select empno,ename from emp; --带检查约束的视图:不能通过视图修改条件数据 create or replace view v2 as select empno,ename,sal from emp where sal>3000 with check option; --只读视图 create or replace view v3 as select empno,ename,sal from emp where sal<3000 with read only; --错误视图 create or replace force view v4 as select empno,ename,sal from emp2 where sal<3000 with read only; --给列取别名的试图 create or replace view v5 as select empno 编号,ename,sal from emp where sal<3000 with read only; create or replace view v5 (编号,姓名,工资) as select empno,ename,sal from emp where sal<3000 with read only; create or replace view v6 as select empno,ename,dname from emp,dept where emp.deptno(+)=dept.deptno; -- 有+的是从表 4.索引 1.标准: create index ind_bz on student(stuno); 2.唯一:不能有重复值 create unique index ind_un on student(name); 3.组合:基于多列查询时 create index ind_zh on student(name,address); 10001 10001 4.反向键:适合连续值的列 create index ind_fx on student(stuno) reverse; 5.位图:适合于低基数列 create bitmap index ind_bm on student(address); 6.函数索引:字符型数据列 create index ind_hs on student(lower(name));
--二章节 1.创建同义词的语法 create synonym sy_name for scott.dept; 2.创建序列的语法 create sequence seq_name start with 1 increment by 2 maxvalue 1000000 minvalue -100 cycle cache 10; seq_name.nextval seq_name.currval 3.创建视图的语法 create force view v8 as select * from emp with read only; 4.索引的种类及语法 1.标准 2.唯一 3.组合 4.函数 5.反向键 6.位图 1.PL/SQL内容 1.DML 2.TCL 3.游标控制 4.SQL函数和运算符 2.支持的数据类型 1.所有的SQL类型 2.支持NULL 3.Boolean 4.属性类型:%type %rowtype 3.组成部分 1.声明部分[可选的] 2.可执行部分 3.异常处理部分[可选的] DECLARE --声明 ... BEGIN --可执行 .... EXCEPTION --异常 .... END; 4.变量和常量 1. v_empno number(4); 2. v_ename varchar2(10):='scott'; 3. v_pi constant number default 3.14; 5.为变量赋值 1.v_empno:=7788; 2.select ename into v_ename from emp where empno=7788; 6.条件控制 1.IF ... THEN ... END IF; 2.IF ... THEN ... ELSE ... END IF; 3.IF ... THEN ... ELSIF ... THEN ... END IF; 7.循环语句 1.LOOP ... END LOOP; --无条件循环 2.WHILE 条件 LOOP ... END LOOP; 3.FOR i IN 1..10 LOOP ... END LOOP; --pl/sql测试 set serveroutput on --打开输出 begin dbms_output.put_line('世界上最简单的PL/SQL'); end; --变量和常量 declare v_empno number(4); v_ename varchar2(10); begin v_empno:=7788; select ename into v_ename from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_ename); end; / --属性类型 declare v_empno number(4); v_ename emp.ename%type; begin v_empno:=7788; select ename into v_ename from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_ename); end; / declare v_empno number(4); v_emp emp%rowtype; begin v_empno:=7788; select ename,sal into v_emp.ename,v_emp.sal from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_emp.ename||',工资'||v_emp.sal); end; / --IF语句 declare v_sex varchar2(2); begin v_sex := '&sex'; --从屏幕接受输入 if v_sex='男' then dbms_output.put_line('先生...'); elsif v_sex='女' then dbms_output.put_line('女士...'); else dbms_output.put_line('人妖...'); end if; end; --CASE语句 begin case '&性别' when '男' then dbms_output.put_line('先生...'); when '女' then dbms_output.put_line('女士....'); else dbms_output.put_line('人妖...'); end case; end; declare v_sex varchar2(2); begin v_sex := '&sex'; --从屏幕接受输入 case when v_sex='男' then dbms_output.put_line('先生...'); when v_sex='女' then dbms_output.put_line('女士....'); else dbms_output.put_line('人妖...'); end case; end; --LOOP、 declare v_num number:=1; begin loop /*if (v_num>5) then exit; end if; */ exit when v_num>5; --退出 dbms_output.put_line('loop: '||v_num); v_num:=v_num+1; end loop; end; / --while declare v_num number:=1; begin while v_num<=5 loop dbms_output.put_line('loop: '||v_num); v_num:=v_num+1; end loop; end; --for begin for v_num in 1..5 loop dbms_output.put_line('loop: '||v_num); end loop; end; --动态sql declare v_sql varchar2(200); v_a number:=1; v_b varchar2(20):='hello'; begin v_sql:='create table test(a number(2),b varchar2(20))'; --执行 execute immediate v_sql; v_sql:='insert into test values(:a,:b)'; execute immediate v_sql using v_a,v_b; end; --异常 declare v_name emp.ename%type; v_i number; begin select ename into v_name from emp; v_i:=5/0; exception when TOO_MANY_ROWS then dbms_output.put_line('肉丝太多....'); when ZERO_DIVIDE then dbms_output.put_line('除数不能为0'); when others then dbms_output.put_line('未知异常'); end; / --自定义异常 declare v_sex varchar2(2); e_sex exception;--自定义异常 begin v_sex:='&sex'; if v_sex!='男' and v_sex!='女' then raise e_sex; --抛异常 end if; exception when e_sex then dbms_output.put_line('性别搞错哒》。。。'); end;
--三章节 1.pl/sql支持的语句 dml tcl 游标 函数和运算符 2.pl/sql的数据类型 所有sql类型 null boolean 属性类型 %type: %rowtype 3.为变量赋值 a:=10; select ename,sal into a,s from emp where ...; 1.游标 1.概念:在pl/sql中,用来查询,并指向集合的指针 2.作用:逐行处理查询结果,以编程的方式访问数据 3.类型:隐式游标、显示游标、ref游标 2.隐式游标 1.在Pl/sql指向DML语句时自动创建 2.名称:SQL 3.属性 1.%FOUND:有影响的行数返回true 2.%NOTFOUNT:没有影响的行数返回true 3.%ROWCOUNT:返回影响的行数 4.%ISOPEN:是否打开 3.显示游标 1.作用:处理返回多行的结果集 2.步骤: 1.声明:CURSOR cur_name IS SELECT ....; 2.打开:OPEN cur_name; 3.提取记录:FETCH cur_name INTO var1,var2...; 4.关闭:CLOSE cur_name; 4.REF游标 1.执行动态指定SQL语句 2.强ref游标:有return,约束了查询的结果集结构 1.%rowtype 2.自定义Record类型 3.弱ref游标:没有return --隐式游标 begin delete from emp where deptno=10; --判段执行的情况 if sql%FOUND then dbms_output.put_line('删除了'||sql%ROWCOUNT||'行记录'); end if; if sql%notfound then dbms_output.put_line('没有删除人...'); end if; end; --显示游标 declare --声明 cursor cur_name is select empno,ename from emp; v_no emp.empno%type; v_name emp.ename%type; begin --打开 open cur_name; loop --提取数据 fetch cur_name into v_no,v_name; --退出 exit when cur_name%notfound; dbms_output.put_line(v_no||' '||v_name); end loop; close cur_name; --关闭 end; --带参数的游标 declare --声明 cursor cur_name(no number) is select empno,ename from emp where deptno=no; v_no emp.empno%type; v_name emp.ename%type; begin --打开 open cur_name(&no); loop --提取数据 fetch cur_name into v_no,v_name; --退出 exit when cur_name%notfound; dbms_output.put_line(v_no||' '||v_name); end loop; close cur_name; --关闭 end; --修改记录 declare --声明 cursor cur_name is select deptno,ename,sal from emp for update; v_no emp.deptno%type; v_name emp.ename%type; v_sal emp.sal%type; begin --打开 open cur_name; loop --提取数据 fetch cur_name into v_no,v_name,v_sal; --退出 exit when cur_name%notfound; if(v_no=10) then update emp set sal=sal+1000 where current of cur_name; v_sal:=v_sal+1000; end if; dbms_output.put_line(v_no||' '||v_name||' '||v_sal); end loop; close cur_name; --关闭 end; --循环游标 declare cursor cur_name(no number) is select ename,deptno from emp where deptno=no; begin for rec in cur_name(&no) loop dbms_output.put_line(rec.ename||' '||rec.deptno); end loop; end; --弱类型ref游标 declare TYPE ref_cur_name IS REF CURSOR;--游标类型 cur_name ref_cur_name;--游标变量 v_name emp.ename%type; v_no emp.deptno%type; begin --打开 open cur_name for select ename,deptno from emp; loop fetch cur_name into v_name,v_no; exit when cur_name%notfound; dbms_output.put_line(v_name||' '||v_no); end loop; close cur_name; end; --强ref游标 declare TYPE ref_cur_name IS REF CURSOR return emp%rowtype;--游标类型 cur_name ref_cur_name;--游标变量 v_emp emp%rowtype; begin --打开 open cur_name for select * from emp;--ename,deptno loop fetch cur_name into v_emp; exit when cur_name%notfound; dbms_output.put_line(v_emp.ename||' '||v_emp.deptno); end loop; close cur_name; end; --自定义Record类型 declare TYPE rec_type IS RECORD( name emp.ename%type, deptno emp.deptno%type );--类型 v_rev rec_type; --Record类型变量 TYPE ref_cur_type IS REF CURSOR return rec_type; cur_name ref_cur_type; begin open cur_name for select ename,deptno from emp where deptno=&no; loop fetch cur_name into v_rev; exit when cur_name%notfound; dbms_output.put_line(v_rev.name||' '||v_rev.deptno); end loop; end; /
--四章节 1.什么是游标 2.游标的分类 3.游标的四个属性 4.显示游标的操作步骤 5.如何定义和使用显示游标修改数据 1.过程 2.函数 3.程序包 --最简单的存储过程 create or replace procedure p1 is begin dbms_output.put_line('你好,.....'); end; --调用 exec[ute] p1; --IN 参数 create or replace procedure p2 (eno number) as v_name emp.ename%type; begin select ename into v_name from emp where empno=eno; dbms_output.put_line(v_name); end; / --执行 execute p2(7788); --按位置传参 execute p2(eno=>7788); --按名称传参 call p2(7788); --pl/sql调用 begin p2(&no); end; --OUT 参数 create or replace procedure p3 (eno IN number,name OUT varchar2) as begin select ename into name from emp where empno=eno; end; / --调用 declare v_name varchar2(20); begin --p3(name=>v_name,eno=>7788); p3(7788,name=>v_name); dbms_output.put_line(v_name); end; --IN OUT 参数 create or replace procedure p4 (num1 IN OUT number,num2 IN OUT number) is num3 number; begin num3 := num2; num2 := num1; num1 := num3; end; / --调用 declare v_1 number:=10; v_2 number:=20; begin p4(v_1,v_2); dbms_output.put_line(v_1||' '||v_2); end; --授予执行权限 grant execute on p1 to aniu; --简单的函数 create or replace function fun1 return varchar2 is begin return '你好,朋友....'; end; --调用 select fun1 from dual; --pl/sql调用 declare v_n varchar(20); begin dbms_output.put_line(fun1); v_n := fun1; dbms_output.put_line(v_n); end; --调用 VAR v varchar2(20) --声明全局变量 exec :v:= fun1; print :v; --带参数的函数 create or replace function fun2 (eno number) return varchar2 is v_name varchar2(20); begin select ename into v_name from emp where empno = eno; return v_name; end; --调用 declare v_name varchar2(20); begin v_name:= fun2(&no); dbms_output.put_Line(v_name); end; --授权 grant execute on fun1 to scott; --程序包规范 create or replace package pack1 is CURSOR cur_fenye(page number,line number) return emp%rowtype;--声明游标 function fun2(eno number) return varchar2; --声明函数 procedure p1(eno number); --声明过程 procedure proc_fenye(page number,line number);--分页的存储过程 end pack1; --程序包主题 create or replace package body pack1 is --实现游标 CURSOR cur_fenye(page number,line number) return emp%rowtype IS select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from( select rownum r,e.* from emp e where rownum<=page*line ) a where a.r>(page-1)*line; --实现函数 function fun2 (eno number) return varchar2 is v_name varchar2(20); begin select ename into v_name from emp where empno = eno; return v_name; end; --实现过程 procedure p1(eno number) is v_name varchar2(20); begin select ename into v_name from emp where empno=eno; dbms_output.put_Line(v_name); end; --实现分页的存储过程 procedure proc_fenye(page number,line number) is v_emp emp%rowtype; begin open cur_fenye(page,line);--打开 loop fetch cur_fenye into v_emp; exit when cur_fenye%notfound; dbms_output.put_line(v_emp.empno||' '||v_emp.ename||' ' ||v_emp.sal); end loop; close cur_fenye; end; end pack1; --调用 select pack1.fun2(7788) from dual; exec pack1.p1(7788); --调用分页 exec pack1.proc_fenye(4,4); --格式化列的现实 COLUMN LINE FORMAT 999 COLUMN TEXT FORMAT A70 SELECT line,text FROM USER_SOURCE WHERE NAME=UPPER('P2');