PLSQL基础培训.ppt
《PLSQL基础培训.ppt》由会员分享,可在线阅读,更多相关《PLSQL基础培训.ppt(55页珍藏版)》请在三一办公上搜索。
1、PL/SQL基础培训 刘丹,CUC-AS1-N3,PL/SQL语言的编程规范Oracle数据库的基本数据类型和函数应用PL/SQL语言编写基本的sql,通过本章的学习应该掌握:,一、PL/SQL语言编程规范,1)命名语言-命名使用能表述对象意义的单词或者约定俗成的符号,不允许使用中文或者特殊符号。单词分隔-命名的各单词使用下划线进行分隔。保留字-命名禁止使用sql保留字(可以在v$reserved_words视图中查找所有的保留字)。命名长度-限制在30个字符内(含前缀)。,2)命名规范普通变量-前缀为v_,存放字符、数字、日期型变量。游标变量-前缀为cur_,存放游标记录集。存储过程-前缀为
2、p_,按照业务操作命名。函数-前缀为f_,按照业务操作命名。包-前缀为pkg_,按照业务操作集合命名。触发器-前缀为trig_,触发器名是前缀+表名+触发器名索引-前缀为IDX_,索引名是前缀+表名+索引字段,3)使用绑定变量 当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。而唯一使得oracle能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样 硬解析需要经解析,制定执行路径,优化访
3、问计划等许多的步骤.如果你的查询本身耗时就很长,就没必要绑定变量了,因为解析的消耗微乎其微 select sql_text,parse_calls from v$sql where sql_text like UPDATE AA1%eg:ls_sql:=update AA1set status=1,sale_trade_id=|v_trade_id|,sale_date=sysdate where card_no=:1;execute immediate ls_sql using vi_card_no;,PL/SQL 语言,1)基本数据类型VARCHAR2 变长字符串,最长为4000字符。NU
4、MBER 数值型。LONG 变长字符数据,最长为2G字节。DATE 日期型。RAW 二进制数据,最长为255字节。LONG RAW 变长二进制数据,最长为2G字节。CHAR 定长字符数据,最长为255。LOB 大对象”数据类型 CLOB 可用于存储非结构化的XML文档。BLOB 可以存储较大的二进制对象,如图形、视频剪辑和声音剪辑等。,二、基本数据类型与函数,PL/SQL 语言,2)函数,单行字符串函数-ASCII(),INSTR(),LENGTH(),UPPER(),LPAD(),LTRIM(),RPAD(),RTRIM(),REPLACE(),SUBSTR(),TRIM(),CONCAT(
5、)单行数字函数-ABS(),ACOS(),ASIN(),ATAN(),CEIL(),COS(),LOG(),MOD(),ROUND(),SIN(),TRUNC()单行日期函数-ADD_MONTHS(),LAST_DAY(),MONTHS_BETWEEN(),NEW_TIME(),NEXT_DAY(),ROUND(),SYSDATE,TRUNC(),TO_CHAR(),TO_DATE(),TO_NUMBER()其他单行函数-BFILENAME(),DECODE(),DUMP(),GREATEST(),LEAST(),USERENV(),NVL()NULL和单行函数-NULL值表示一个未知数据或者
6、一个空值,算术操作符的任何一个操作数为NULL值,结果均为NULL值,这个规则也适合很多函数,只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NVL参数时可以返回非NULL值。,a、单行函数-返回基于单行的单一结果,PL/SQL 语言,又名集合函数-AVG(),COUNT(),MAX(),MIN(),STDDEV(),SUM(),VARIANCE()数据进行分组-GROUP BY Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A,B,C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行G
7、ROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A,B,C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。grouping_id()可以美化效果,b、组函数-返回基于多行的单一结果,c、嵌套函数-函数可以嵌套,优先权基于位置,遵循由内到外,由左到右的原则。,PL/SQL 语言,Oracle扩展PL/SQL简介,PL/SQL是Oracle对SQL规范的扩展,是一种块结构语言,即构成一个PL/SQL程序的基本单位(过程、
8、函数和无名块)是逻辑块,可包含任何数目的嵌套了快。这种程序结构支持逐步求精方法解决问题。一个块(或子块)将逻辑上相关的说明和语句组合在一起,其形式为:DECLARE-说明 BEGIN-语句序列 EXCEPTION-例外处理程序 END;,三、应用PL/SQL语言编写基本的sql,PL/SQL 语言,控制语句1)分支语句:IF condition THENSequence_of_statements;END IF;IF condition THENSequence_of_statement1;ELSESequence_of_statement2;END IF;,PL/SQL 语言,2)循环语句:
9、LOOPSequence_of_statements;IF condition THENEXIT;END IF;END LOOP;WHILE condition LOOPSequence_of_statements;END LOOP;FOR counter IN lower_bound.higher_bound LOOPSequence_of_statements;END LOOP;,PL/SQL 语言,数据操纵语言命令(DML),用于在关系数据库对象中操纵数据INSERT insert into tab_name(col1,col2)values(1,2);UPDATE update tab
10、_name a set a.col1=1where col2=1;DELETE delete from tab_name where col1=1;,PL/SQL 语言,数据控制语言命令(DCL)用于创建与用户访问相关的对象,也控制着用户的权限分配ALTER PASSWORD改变口令GRANT为用户授予特权REVOKE从用户处收回特权,事物控制命令,Commit 完成事务,数据修改成功并对其他用户开放。Rollback 撤销事务,撤销所有操作。rollback to savepoint 撤销在设置的回滚点以后的操作。set transaction响应事务或语句的一致性,特别对于事务使用回滚段。
11、,PL/SQL 语言,数据定义语言命令(DDL),Create-创建某个对象Create table tab_name(col varchar(2)not null);Drop-删除某个对象Drop table(view)tab_name;Grant-赋予权限命令Grant update on tab_name to user_name;Revoke-收回权限命令Revoke update on tab_name from user_name;,PL/SQL 语言,SQL中操作符的使用,定义:操作符是保留的字或字符,主要用于比 较和算术运算。分类:比较操作符,逻辑操作符和算术运算符。1、比较操
12、作符包括:=,,=。注意比较双方的数据类型。2、算术运算符包括:+,-,*,/等。与数学运算规则一致。,PL/SQL 语言,SQL中逻辑操作符的使用,IS NULL(是否为空)BETWEEN(在某两个值之间)IN(一系列值中)LIKE(相似值的比较)EXITS(是否存在符合条件的数据)ALL/ANY(一组数据的所有/其中的任何一个)AND/OR(逻辑与/或),PL/SQL 语言,子程序1)存储过程:CREATE PROCEDURE 过程名(参数说明1,参数说明2,。)IS局部说明BEGIN执行语句;END 过程名;2)存储函数:CREATE FUNCTION 函数名(参数说明1,参数说明2,。
13、)RETURN 类型 IS局部说明BEGIN执行语句;END 函数名;,PL/SQL 语言,应用PL/SQL语言编写sql,sql语句不区分大小写sql语句可以由一行或者多行组成在一行中关键字不能缩写或者被拆开子句通常书写在不同的行上采用行缩进来增强程序的阅读性,PL/SQL 语言,CASE表达式,CASE WHEN comparison_expr1 THEN return_expr1 WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_exprEND,PL/SQL
14、语言,DECODE表达式,DECODE(col|expression,search1,result1,search2,result2,.,default)DECODE语句=IF-THEN-ELSE的实现,PL/SQL 语言,%type用法,declaremyid aa2.MDATE%type;myname aa2.SNUM%type;beginselect MDATE,SNUM into myid,myname from aa2 where MDATE=20120801;dbms_output.put_line(myid);dbms_output.put_line(myname);end;/当
15、表结构字段类型或者长度变化后,程序中无需在变,PL/SQL 语言,%rowtype用法,declaretype type_dept is table of aa2%rowtype index by binary_integer;tb type_dept;begintb(1).MDATE:=20120812;tb(1).SNUM:=12;tb(2).MDATE:=20120813;tb(2).SNUM:=13;dbms_output.put_line(tb(1).MDATE|tb(1).SNUM);dbms_output.put_line(tb.COUNT);end;/,PL/SQL 语言,TY
16、PE用法,相当于结构体,declarelv_order_date DAte:=sysdate;lv_last_txt varchar2(5)default 001;lv_last varchar2(10)not null:=us;TYPE type_test is record(MDATE aa2.MDATE%type,SNUM aa2.SNUM%type);rec type_test;beginlv_order_date:=sysdate;dbms_output.put_line(lv_last);select MDATE,SNUM into rec from aa2 where MDATE
17、=20120801;dbms_output.put_line(rec.MDATE);dbms_output.put_line(rec.SNUM);end;,PL/SQL 语言,游标的使用:,declare-类型定义 cursor c_job is select MDATE,SNUM from aa2;-定义一个游标变量 c_row c_job%rowtype;begin for c_row in c_job loop dbms_output.put_line(c_row.MDATE|-|c_row.SNUM);end loop;end;,PL/SQL 语言,游标的使用:Fetch游标,使用的时
18、候必须要明确的打开和关闭,declare-类型定义 cursor c_job is select MDATE,SNUM from aa2;-定义一个游标变量 c_row c_job%rowtype;begin open c_job;loop-提取一行数据到c_row fetch c_job into c_row;-判读是否提取到值,没取到值就退出-取到值c_job%notfound 是false-取不到值c_job%notfound 是true exit when c_job%notfound;dbms_output.put_line(c_row.MDATE|-|c_row.SNUM);end
19、 loop;-关闭游标 close c_job;end;,PL/SQL 语言,游标的使用:别的写法,declare-类型定义 cursor c_job is select MDATE,SNUM from aa2;-定义一个游标变量 c_row c_job%rowtype;begin open c_job;-给第一行数据 fetch c_job into c_row;while c_job%found loop dbms_output.put_line(c_row.MDATE|-|c_row.SNUM);-给下一行喂数据 fetch c_job into c_row;end loop;-关闭游标
20、 close c_job;end;,PL/SQL 语言,游标的使用:UPDATE写法,declare-类型定义 cursor c_job is select MDATE,SNUM from aa2 for update OF SNUM;-定义一个游标变量 c_row c_job%rowtype;begin open c_job;-给第一行数据 fetch c_job into c_row;while c_job%found loop UPDATE aa2 SET SNUM=SNUM+1 WHERE CURRENT OF c_job;-给下一行喂数据 fetch c_job into c_row
21、;end loop;-关闭游标 close c_job;commit;end;,PL/SQL 语言,exception用法,declare ex Exception;v_MDATE aa2.mdate%type;begin where MDATE=20120812;*/select MDATE into v_MDATE from aa2/*where MDATE=20120814*/;if SQL%NOTFOUND Then Raise ex;end if;commit;Exception When ex then dbms_output.put_line(update failed.);ro
22、llback;when NO_DATA_FOUND then dbms_output.put_line(no record is found);when TOO_MANY_ROWS then dbms_output.put_line(too many rows are selected);when OTHERS then dbms_output.put_line(error message:|SQLERRM);rollback;end;/,PL/SQL 语言,触发器注意点,触发器不接受参数。一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾
23、。在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。在触发器主体中不能申明任何Long和blob变量。新值new和旧值old
24、也不能向表中的任何long和blob列。不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。,PL/SQL 语言,触发器使用,CREATE OR REPLACE TRIGGER tr_aa2AFTER(BEFORE)INSERT OR DELETE OR UPDATE(一个是在记录操作之前触发,一个是在记录操作之后触发)ON aa2 FOR EACH ROW(去掉 FOR EACH ROW,行触发器及语句触发器)BEGIN IF UPDATING(snum)THEN RETURN;END IF;if:new.mdate=20120814 the
25、n return;else if inserting then insert into aa3 values(:new.mdate,:new.snum);end if;if updating then insert into aa3 values(:old.mdate,:old.snum);end if;end if;END;,PL/SQL 语言,视图使用,视图是存储在数据库中的预先定义好的查询,具有表的外观,可以象表一样对其进行存取,但不占据物理存储空间create or replace view view_aa2 asselect MDATE,SNUM from aa2group by M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLSQL 基础 培训
链接地址:https://www.31ppt.com/p-5444133.html